市田です。

西山さん、中田さん、情報ありがとうございます。

On 2016/10/16 17:47, Nobuyoshi Nakada wrote:
> なかだです。
>
> On 2016/10/16 16:53, Kazuhiro NISHIYAMA wrote:
>> At Sun, 16 Oct 2016 14:38:13 +0900,
>> Toshihiko Ichida wrote:
>>>
>>>  -      Kernel.exec(*args)
>>>  +      Kernel.exec(args.join ' ')
>>
>> Linux などでは普通 Shellwords.shelljoin などを使うと思うのですが、
>> Windows では普通の Array#join でも大丈夫なのでしょうか?
>
> cmd.exeのエスケープ処理はshのとは別物なので、どちらも同程度にダメです。

確かに Array#join だと空白を含む引数はだめなのははっきりしています。
空白だけなら
cmdline = args.map { |x| x.include?(' ') ? "\"#{x}\"" : x }.join(' ')
などとすれば良さそうですが、他に処理しないといけないケースがあるので
しょうか?

なお、Kernel#exec(cmdline) の場合、実行したいものがexeファイルの場合、
次の動作となります。

1.command と .exe を省略して実行
   => path に入っているものを見つけてくれる
      カレントディレクトのものは見つけてくれない
2.command.exe と明示して実行
   => カレントディレクトリのものが実行される
      引数の先頭に実行ファイル名が追加され実行される(引数が増える)

仕様なのかどうか判別はできませんが、ちょっと不思議です。