プロが教える店舗&オフィスのセキュリティ対策術

また、こちらを使わせていただきます。
VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。

.bat fileは次のとおりです。
cd\Program Files\Wireshark>
tshark -i.2 greater 170 -a duration:2 -w....
tshark -v-r e:\Test\test5.pcap....

VC++は次のとおり
void CStartupapplicationView::OnBnClickedButtontest()
{
//cmdは、ShellExecuteでも、CreateProcessでも開けられますが、
//bat fileの起動がうまくいきません。
HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL);

ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW);
//.batファイルは、c:Program Files\Wiresharkの下に入っています。//が、.Batは起動しません。

if (ret <= (HINSTANCE)32) AfxMessageBox("can not Shell.",MB_OK);

//別の方法
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
ZeroMemory(&sinfo,sizeof(STARTUPINFO));
ZeroMemory(&pinfo,sizeof(PROCESS_INFORMATION));
sinfo.cb=sizeof (STARTUPINFO);
sinfo.dwFlags=STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_SHOWNORMAL;

if(!CreateProcess(NULL,_T("cmd.exe c:\\test2.bat "),
// test2.batは、Document and settings/-----------
//Startup applicationの下にはいっていますが、起動しません。
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&sinfo,
&pinfo));
{//起動失敗
}
//

A 回答 (7件)

コマンド受け渡しの根本を理解されていないのが原因です


(#4に書きましたがフォルダにスペース名が入っているのが原因です)

コマンドラインでコマンドを打つときはスペースを区切りとして文字が分断されます
例) プログラム sample.exe として バラメータに
   C:\Program Files と渡したしたいとしましょう

コマンドで sample c:\Program Files と打つと
sample.exeには c:\Program と Files という2個のパラメータが送られるのです
これをスペース含めた1個のパラメータとして渡したい場合
コマンドで sample "c:\Program Files" のようにスペース含む部分を " で囲う必要があるのです

上がちゃんと理解できていれば私が #4/#5 で書いたコードの意味と
御自身で書いたコードが思ったように動かない理由が分かることでしょう

あえてひょっとしたら知らないかな と思うのが
Cの場合 "" で囲った中に " を含みたいときは \" と記載します
ってことです

後は御自分でお考えください
(これ以上の説明は出来ないので以後こちらが補足することはありません)
    • good
    • 0
この回答へのお礼

いつも回答ありがとう御座います。
根本を理解してないとご指摘いただきましたので、再度ShellExecuteの定義を読みました。定義どおりに、(m_hWnd,”open”、バッチファイル名、NULL,Directory,SW_SHOW)としましたら、.batを起動することが、できました。ありがとう御座います。

お礼日時:2010/01/28 23:18

たびたびすいません


#4でも#5でも動くはずです(実行コマンド変えてた)
#4はdos窓開いてバッチファイル実行 終了後はdos窓も消える
$5はdos窓開いてcmd実行した上でバッチファイル実行して其のまま終了
cmd実行した状態で終了するためdos窓が開きっぱなしになります
(/K オプションつけてるから)
適当に変えてください
コマンドの意味はDOS窓で cmd /? と打って御自分で確認してください
    • good
    • 1
この回答へのお礼

いつも回答ありがとうございます。
教えていただいたやり方で、バッチファイルが起動されたというのですが、やってみますと、実行すべきDirectry C:\Program Files\Wiresharkに切り替わらず、バッチの中身だけが、VC++のdirectoryにぶら下がる形になります。ちなみにプログラムを流すと、
以下の用になります。
C:Documents and Settings\Administrator\MYDocuments\Visual Studio 2008\Progects\Start up application\Start up application>
tshark...........
コード(NO1)は以下のようです。
void CStartupapplicationView::OnBnClickedButtontest()
{
ShellExecute(m_hWnd,"open","cmd","/K\"c:\\Program Files\\Wireshark\\test.bat\"",NULL,SW_SHOWNORMAL);

先にも書きましたが、以下のコードでは、cmd上で、directoryは
c:Program Files\Wireshark>に変わります。ここで、バッチを流したいのですが、これができないます。

ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL);

さて最初のコード(NO1)でバッチファイルにcd\Program Files\Wireshark\\tshark.....とcd\Program Filesをつけると、その部分が、
C:Documents and Settings\Administrator\MYDocuments\Visual Studio 2008\Progects\Start up application\Start up application>
cd\Program Files\Wireshark\\tshark.....となってしまいます。
cmd上で、必要なdirectoryになりません。 少しまいっています。

コメントいただけると助かります。

お礼日時:2010/01/23 20:29

ごめん 書き間違えた


ShellExecute(m_hWnd,"open","cmd", "/K \"c:\\Program Files\\Wireshark\\test.bat\"",NULL,SW_SHOW);
です
    • good
    • 0

すいません確認が甘かった


原因はフォルダ名にスペースが入っているためです
スペース文字をフォルダ名として認識させるために
ShellExecute(m_hWnd,"open","\"c:\\Program Files\\Wireshark\\test.bat\"",NULL,NULL,SW_SHOW);
としてください
    • good
    • 0

真面目に見てみました


>ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW);
これパラメータが足りなくないですか?
ShellExecute(m_hWnd,"open","c:\\Program Files\\Wireshark\\test.bat",NULL,NULL,SW_SHOW);
ではないかと思いますが
※ コンパイル時間にもよりますがDOS窓が直ぐ閉じるためやってないように見えるかもしれません
(動いていないというのはどうやって確認されていますか?)

また#1さんの書かれた/C /Kはcmd.exeのパラメータですので定義などは必要ありません
もしやるのであれば
ShellExecute(m_hWnd,"open","cmd", "/K c:\\Program Files\\Wireshark\\test.bat",NULL,SW_SHOW);
としてみてくださいそれで動くはずです
(動かしたバッチファイルは違いますがこちらではそれで動いています XP SP3 + VC6)
    • good
    • 0
この回答へのお礼

早速回答ありがとうございます。

ShellExecute(m_hWnd,"open","cmd","/K c:\\Program Files\\Wireshark\\test2.bat",NULL,SW_SHOW);
にして見ましたが、
DOS画面上で、'c:\Program'は内部コマンドまたは外部コマンド操作可能なプログラムまたはバッチファイルと認識されていないと’
と表示され、
c:\Document and Settings........の画面になります。

少なくとも、c:\Program Files\\Wireshark>test.batを動かしますと
test.batは起動いたします。

どうしてか、わかりません。
XP SP3 VC++ 2008

お礼日時:2010/01/19 03:08

>ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW);


c:\\Progra  だと思うが記載時のミスかな?
    • good
    • 0
この回答へのお礼

ありがとうございます。これは、記載時のミスです。

お礼日時:2010/01/18 20:48

CMD.EXE /C "C:\\Program Files\\Wireshark\\Test.bat"


"
または
CMD.EXE /K "C:\\Program Files\\Wireshark\\Test.bat"

のような感じで実行すれば良いと思います。

ShellExecuteを使用する場合は

CMD.EXE /C
CMD.EXE /K

の部分はなくても実行できるのではないかと思いますが、実行後、コマンドプロンプト画面を閉じたくない場合は

CMD.EXE /K

を使用するとよいと思います。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。但し、ビルトすると、CとKを定義されて無いとしてエラーになります。この、C,Kはどこかで定義が必要ですか?

お礼日時:2010/01/18 20:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A