2012年3月8日木曜日

cmd.exe /c の引数について (半角スペースと"の微妙な関係)

cmd.exe /c の引数について  (半角スペース と " の微妙な関係)


先日ちょっとハマったので、メモがわりに簡単に調査しました。

batファイルに、引数を渡す場合に、その引数に半角スペースがあると
上手く動かない場合があります。

また、batファイル自体のフルパスに半角スペースがある場合は、さらに
混乱してしまいます。

具体的な問題点としては、
・起動しているcmdからbatを引数付きで実行すると問題なし。
・cmd.exe /cを利用して、batを引数付きで実行すると、問題が発生してしまいます。
対処方法としては、/cの後に続く、コマンドラインを でさらに括ります。
------宣伝-----
※VMware ThinApp (アプリケーション仮想化)に興味のある方は、こちらを
御覧ください。

[VMware ThinApp 製品概要と活用 解説書 (日本語 SoftBankBB製) の紹介]

http://tunemicky.blogspot.jp/2013/08/vmware-thinapp-softbankbb.html
------宣伝-----
実験用に以下の環境を用意します。
CドライブにBat Testフォルダを作成し
テスト用のbatファイルを保存しておきます。

【test.batの内容】
格納パス:c:\Bat Test\
※Bat Testとフォルダ名に半角スペースが入っているのもポイントの一つ

@echo off
set PARAM1=%~1
set PARAM2=%~2
echo %PARAM1%
echo %PARAM2%
pause

【実験1】
cmd.exeを起動した状態で、test.batに引数を渡します。
"c:\Bat Test\test.bat" Value1 "Val ue2"
※引数の2つめに半角スペースが入っているのもポイント

出力結果:












問題なく2つの引数が渡されています。半角スペースも問題なし。
C:\>"c:\Bat Test\test.bat" Value1 "Val ue2"
Value1
Val ue2


【実験2】
cmd.exeに/cでbatファイルを指定した場合
cmd.exe /c "c:\Bat Test\test.bat" Value1 "Val ue2"
※実験1と同じコマンドライン
※引数の2つめに半角スペースが入っているのもポイント

出力結果:

問題が発生しています。
cmd.exe /c "c:\Bat Test\test.bat" Value1 "Val ue2"
Bat' は、内部コマンドまたは外部コマンド、
可能なプログラムまたはバッチ ファイルとして認識されていません。
"の区切りがおかしくなってしまい、test.batの格納先の
フォルダ「Bat Test」が「Bat」で切れてしまっています。

【対処方法】
cmd.exe /c ""c:\Bat Test\test.bat" Value1 "Val ue2""
※cmd.exe /c の後に続くコマンドラインの前後を"で更に括ります。
出力結果:











問題なく2つの引数が渡されています。半角スペースも問題なし。
C:\>cmd.exe /c ""c:\Bat Test\test.bat" Value1 "Val ue2""
Value1
Val ue2


【何故こんな事になるのかについての考察】
cmd.exe /cのパラメータのパース処理の仕様だとおもいます。

cmd.exe /c "c:\Bat Test\test.bat" Value1 "Val ue2"
1.前後の"を削除
c:\Bat Test\test.bat" Value1 "Val ue2
2.半角スペースでパース
 引数1
   c:\Bat
 引数2
  Test\test.bat"
 引数3
  Value1 "Val ue2
3.c:\Batって???
c:\Bat?ってなんだ
実行するbatが見当たらないので、エラーを出します。
※たぶんこんな解釈になっていると思います。

対処後(前後に"を入れた場合)
cmd.exe /c ""c:\Bat Test\test.bat" Value1 "Val ue2""
1.前後の"を削除
"c:\Bat Test\test.bat" Value1 "Val ue2"
2.半角スペースでパース("で括っている部分は除く)
 引数1
   "c:\Bat Test\test.bat"
 引数2
  Value1
 引数3
  "Val ue2"
3."c:\Bat Test\test.bat"を実行
問題なく実行される。
※たぶんこんな解釈になっていると思います。
動作確認環境:
Windows 7 SP1 x64
WindowsXP SP3 x86

参考: