63254


ShellExecuteを使ってcmd.exeを呼び出し、batファイルを実行し、その際にフォルダパスを引数に入れたいのですが、batが正常に実行できません。

[code]

    #include <Windows.h>
    #pragma comment( lib, "shell32.lib")
    
    CString strCommand;
    CString strPath;
    strPath = "\"C:\\Sample Folder\\Test\""
    strCommand = "/c \"C:\\Test\\Sample.bat\" " + strPath;
    ShellExecute(NULL, "open", "cmd.exe", strCommand, "", SW_SHOW);
    
[/code]

引数のフォルダ名称に半角スペースがない場合で、パスの両端をダブルクォーテーションで括らない場合は動作するのですが、上記のように半角スペースが存在する場合も考えられるため、両端をダブルクォーテーションで括る必要があるのですが、その場合batが動作しません。

宜しくお願いします。


CC BY-SA 4.0
2019-08-29T01:18:44.947
57667
2020-02-22T05:44:54.547
19580
question
c++ mfc cmd
ShellExecuteでcmd.exeからbat実行する際に引数にフォルダパスを入れたい


コメント内容が該当したので以下の記事から引用して回答化(太字は引用者)：  
[cmd.exe /c の引数について (半角スペースと"の微妙な関係)
](https://tunemicky.blogspot.com/2012/03/cmdexe-c.html)

> 【実験2】  
>  cmd.exeに/cでbatファイルを指定した場合  
>  cmd.exe /c "c:\Bat Test\test.bat" Value1 "Val ue2"  
>  ※実験1と同じコマンドライン  
>  ※引数の2つめに半角スペースが入っているのもポイント  
>  出力結果：  
>
> [![実験2画像](https://i.stack.imgur.com/9h2s0.png)](https://i.stack.imgur.com/9h2s0.png)
>
> 問題が発生しています。  
>  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 の後に続くコマンドラインの前後を"で更に括ります。**  
>  出力結果：  
>
> [![対処結果画像](https://i.stack.imgur.com/PRRKo.png)](https://i.stack.imgur.com/PRRKo.png)
>
> 【何故こんな事になるのかについての考察】  
>  cmd.exe /cのパラメータのパース処理の仕様だとおもいます。

以下省略

* * *

質問のプログラムで言えば以下の行を、

[code]

    strCommand = "/c \"C:\\Test\\Sample.bat\" " + strPath;
    
[/code]

こちらのようにすれば、正常に処理されます。

[code]

    strCommand = "/c \"\"C:\\Test\\Sample.bat\" " + strPath + "\"";
    
[/code]

Unicode版ならこちら。

[code]

    strCommand = L"/c \"\"C:\\Test\\Sample.bat\" " + strPath + L"\"";
    
[/code]


CC BY-SA 4.0
2020-02-22T05:44:54.547
63254
2020-02-22T05:44:54.547
26370
57667
answer