たけ(tk)です。 他のMLでの質問に対する回答ですが、Ruby 本体でも参考になると思うので 転送しておきます。 http://www.freeml.com/ml_view.php?ml=ap-list&pg=2379 -- [ap-list:2378] 空白を含むファイルをsystemで起動するには? にて 岩崎 弘孝 <IH000667 / mb.taiyokogyo.co.jp> さん 曰く: > c:\program files\配下のプログラムをsystem関数で起動したいのですが、 > フォルダー名に空白があるとうまく動作しないようです。 ・・・ > apolloの問題ではなくrubyの問題のような感じですが、 Ruby 本体の問題ですが(というかMSの仕様の問題だと思うけど)、本家で 対応するとは思えませんね。 > 無論、c:\program files\ など空白文字を避けるでは困ります。 一つの解決方法(↓)。(↑)の条件に反するかな?。 -- #!ruby -Ks require "phi" ; include Phi ##require "tkutils" ## ## From TkUtils.rb ## ## -- get_short_path_name ## ## 長いパス名を短いパス名に変換する。 ## MAX_PATH_SIZE = 513 def get_short_path_name lfn old_name = File.basename(lfn) require 'Win32API' buff = 0.chr * MAX_PATH_SIZE len = Win32API.new( 'kernel32' , 'GetShortPathName' , %w(P P N) , "N" ). Call( lfn , buff, buff.size) return nil if len==0 ret = buff.split(0.chr)[0].tr('\\','/')[0,len] name = File.basename(ret) dir = ret[0,ret.size - name.size] if name.size > old_name.size name = name[0,old_name.size] end return dir+name end alias sfn get_short_path_name ######## path = "c:/program files/Common Files/Borland Shared/BDE/BdeAdmin.exe" path = "c:\\program files\\adir\\ap.exe" system( sfn( path )) -- > それからsystem関数でなく、別な方法で起動する事ができるなら > それも例示して頂けると助かります。 apeed_ut.rb に入っている win_exec、shell_open が使えそうです。 * apeed_ut.rb を単体で起動すると次の部分でエラーになるので、一行追加 してください。 > unless defined? NKF_GUESS_MSG > require "kconv" ## ←この行を追加 > NKF_GUESS_MSG = { -- path = "c:/program files/Common Files/Borland Shared/BDE/BdeAdmin.exe" require "./apeed_ut" TkUtils.win_exec( path ) TkUtils.shell_open( path ) -- system や `` ではスクリプトの実行が停止してしまいますが、上の二つでは 並行実行されてスクリプトは次に進みます。 IO.open では並行起動しますが、スクリプトが終了すると起動したコマンドも 終了してしまいます。またオブジェクトを保持しておかないと GC で起動したプ ロセスが消えてしまう。 −−−− Take_tk = KUMAGAI Hidetake たけ(tk)=熊谷秀武