OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ShellExecuteでDOSコマンド実行したら...

  • 暇なときにでも
  • 質問No.102859
  • 閲覧数2431
  • ありがとう数3
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 83% (55/66)

VC++6.0においてShellExecuteでDOS窓をたち上げてコマンドを
実行したいのですが、うまくいきません。

1.ShellExecute(m_hWnd,"open","command.com","dir",NULL,SW_SHOW);
...とすると”指定された COMMAND 検索ディレクトリが違います.”となり、
なにも実行されません。

2.ShellExecute(m_hWnd,"open","command.com","dir /?",NULL,SW_SHOW);
...とするとちゃんとdirのヘルプが表示されますが、すぐに窓が閉じます。

3.ShellExecute(m_hWnd,"open","command.com","dir /? > out.txt",NULL,SW_SHOW);
...としてもファイルが作られず、2.と全く同じ結果になってしまいます。

これはどうしてこのような現象が起きるのでしょうか?
DOSプロンプトをたち上げて同様なコマンドを実行した場合はちゃんと期待通りの結果が得られます。
あと、DOS窓が閉じないようにするにはどうすればいいのでしょうか?
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル14

ベストアンサー率 33% (1403/4213)

3.の部分について。
VBで似たような事をしたときのことですが。

「COMMAND/C DIR > C:\DIR.TXT」とやら無いと
リダイレクトの結果が残せませんでした。

参考になりましたら。
お礼コメント
ystk

お礼率 83% (55/66)

回答ありがとうございます。
ご指摘の通りdirの前に /Kやら/Cやらオプションを付けると
それだけで1も2も3も全てうまくいくようです(ナゼだ???)

結局良く分からないので、ShellExecute()は止めて、system()関数(VBにもあるのかな?)を使うようにしました。

ありがとうございました。
投稿日時 - 2001-07-12 09:35:17
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル8

ベストアンサー率 44% (11/25)

DOS窓を閉じないようにするには、command.comに/kオプションを付けて 起動すればOKです。↓こんな感じです。  ShellExecute(hWnd, "open", "command.com", "/k dir", NULL, SW_SHOWNORMAL); (WinNT/2Kはcmd.exeを起動したほうが良いと思います) ...続きを読む
DOS窓を閉じないようにするには、command.comに/kオプションを付けて
起動すればOKです。↓こんな感じです。
 ShellExecute(hWnd, "open", "command.com", "/k dir", NULL, SW_SHOWNORMAL);
(WinNT/2Kはcmd.exeを起動したほうが良いと思います)

1~3の現象について何故そうなるかはよくわかりませんが、おそらく
command.comの起動オプションの書式エラーになっているだけだと思います。
DOS窓で command.com /? としてヘルプを見ると、
 COMMAND [[ドライブ:]パス] [デバイス] ...
のようになっていますが、"dir"文字列がドライブ、パスとして認識されて
いるのかもしれません。
2.についても、dirコマンドのヘルプではなく、command.comのヘルプが
表示されているはずです。
(3.のファイルに出力されない理由はわかりません)
お礼コメント
ystk

お礼率 83% (55/66)

回答ありがとうございます。
/K オプション COMMAND.COMのヘルプにありましたね。回答を頂いて気づきました。(^^;)
そこで色々試してみたのですが、 dirの前に /Kやら/Cやらオプションを付けると
それだけで1も2も3も全てうまくいくようです(ナゼだ???)

結局良く分からないので、ShellExecute()は止めて、system()関数を使うようにしました。

ありがとうございました。
投稿日時 - 2001-07-12 09:26:49
  • 回答No.3
レベル14

ベストアンサー率 33% (1403/4213)

「チャイルドプロセス」がキーワードとなるような話を思い出しました。 DIRはDOSの内部コマンドで実行するのはcommand.comです。 リダイレクトで結果保存するのもcommand.comであるため 表示するための領域が必要なのでしょう。 DOSのバッチ処理を作成する際、「複数のバッチ処理を呼ぶバッチ」を実現する ために必要でした。(今は Callが使えるから)
「チャイルドプロセス」がキーワードとなるような話を思い出しました。

DIRはDOSの内部コマンドで実行するのはcommand.comです。
リダイレクトで結果保存するのもcommand.comであるため
表示するための領域が必要なのでしょう。

DOSのバッチ処理を作成する際、「複数のバッチ処理を呼ぶバッチ」を実現する
ために必要でした。(今は Callが使えるから)
  • 回答No.4

command.comのオプションをご覧ください。Windows NT/2000の場合は cmd.exeをお使いになることをお勧めします。command.comで実現されて いるコマンドを実行させるためには/cスイッチを使います。 ShellExecute(handle, "Open"          , "command.com" ...続きを読む
command.comのオプションをご覧ください。Windows NT/2000の場合は
cmd.exeをお使いになることをお勧めします。command.comで実現されて
いるコマンドを実行させるためには/cスイッチを使います。

ShellExecute(handle, "Open"
         , "command.com"
, "/c dir /? > out.txt"
            , SW_SHOW);


としてみてください。
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ