たけ(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)=熊谷秀武