- ベストアンサー
VC++ で.bat起動
また、こちらを使わせていただきます。 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)); {//起動失敗 } //
- みんなの回答 (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の場合 "" で囲った中に " を含みたいときは \" と記載します ってことです 後は御自分でお考えください (これ以上の説明は出来ないので以後こちらが補足することはありません)
その他の回答 (6)
- koi1234
- ベストアンサー率53% (1866/3459)
たびたびすいません #4でも#5でも動くはずです(実行コマンド変えてた) #4はdos窓開いてバッチファイル実行 終了後はdos窓も消える $5はdos窓開いてcmd実行した上でバッチファイル実行して其のまま終了 cmd実行した状態で終了するためdos窓が開きっぱなしになります (/K オプションつけてるから) 適当に変えてください コマンドの意味はDOS窓で cmd /? と打って御自分で確認してください
お礼
いつも回答ありがとうございます。 教えていただいたやり方で、バッチファイルが起動されたというのですが、やってみますと、実行すべき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になりません。 少しまいっています。 コメントいただけると助かります。
- koi1234
- ベストアンサー率53% (1866/3459)
ごめん 書き間違えた ShellExecute(m_hWnd,"open","cmd", "/K \"c:\\Program Files\\Wireshark\\test.bat\"",NULL,SW_SHOW); です
- koi1234
- ベストアンサー率53% (1866/3459)
すいません確認が甘かった 原因はフォルダ名にスペースが入っているためです スペース文字をフォルダ名として認識させるために ShellExecute(m_hWnd,"open","\"c:\\Program Files\\Wireshark\\test.bat\"",NULL,NULL,SW_SHOW); としてください
- koi1234
- ベストアンサー率53% (1866/3459)
真面目に見てみました >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)
お礼
早速回答ありがとうございます。 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
- koi1234
- ベストアンサー率53% (1866/3459)
>ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW); c:\\Progra だと思うが記載時のミスかな?
お礼
ありがとうございます。これは、記載時のミスです。
- tsukasa-12r
- ベストアンサー率65% (358/549)
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 を使用するとよいと思います。
お礼
早速ありがとうございます。但し、ビルトすると、CとKを定義されて無いとしてエラーになります。この、C,Kはどこかで定義が必要ですか?
お礼
いつも回答ありがとう御座います。 根本を理解してないとご指摘いただきましたので、再度ShellExecuteの定義を読みました。定義どおりに、(m_hWnd,”open”、バッチファイル名、NULL,Directory,SW_SHOW)としましたら、.batを起動することが、できました。ありがとう御座います。