Shell command.com の 出力結果について

解決


GG  2005-02-25 12:45:46  No: 119925  IP: [192.*.*.*]

Shell command.com の  出力結果を
ファイルに落とすのでなく
直接、文字列変数に入れたいのですが
何か方法あれば、教えて下さい
環境)VB6.0SP6  WIN2000
です

編集 削除
さるべーじ  2005-02-26 17:36:54  No: 119926  IP: [192.*.*.*]

まず、Win2000であれば、Command.comではなくCMD.EXEのはずです。
「CMD.EXEの標準出力をファイル経由ではなく直接VB6で取り込みたい」、と解釈します。

で。
まず、CMD.EXEはシェルですので、たとえば「ipconfig<ENTER>」とした場合、出力はCMD.EXEではなくipconfig.exeが行います。
この場合は、ipconfig.exeは「外部コマンド」という扱いになりますね。
外部コマンドの出力を取得したい場合のコードは、ぬぞうさん(でいいのかなー)が公開されています。

http://tanuzou.com/nuzou/wiki/index.php?VB%A4%C7%B3%B0%C9%F4%A5%B3%A5%DE%A5%F3%A5%C9%A4%CE%C9%B8%BD%E0%BD%D0%CE%CF%BC%E8%C6%C0

注意書きをよく読んでご使用ください。

さて、「dir」などの内部コマンドの場合はどうするか?
「cmd /c "<コマンド>"」で、CMD.EXEをCallしてやればいいんですね。
たとえば、「cmd /c "dir c:\windows"」といぅ感じです。
上記の例では「"」はなくても動作しますが、ないとダメな場合がありますので、必ずつけておくと無難です。

複数の外部/内部コマンドを取り混ぜて一括で出力しその結果を取得したい場合は、バッチファイルを作って流してやると便利です。
「cmd /C "c:\test.bat"」といぅ感じですね。

編集 削除
Say  2005-02-26 17:45:10  No: 119927  IP: [192.*.*.*]

パイプ使うと面倒なので、時間にシビアでない処理なら、
出力をファイルにリダイレクトし、
VB側からそのファイルを読むほうが簡単でいいかも。

編集 削除
ガッ  2005-02-26 17:55:29  No: 119928  IP: [192.*.*.*]

ノ<実は俺もstdoutの出力ほしくてリンク先様の様にガリガリ書いたんだが…
結果はCreateProcessの失敗でorz。
で、今回もorzだったw;
権限の関係なのかちょと不明(っていうかそれ以外に考えられないか…どこだろ)。
だけど、諦めてたらWSHで出来るらしいと聞きました。
…聞いただけでどこにあるかは分かりませんが(orz

※標準でstdout持ってるようなのを中継して、パイプでつなげて受け取るとか…ダメか(orz

編集 削除
Say  2005-02-26 19:24:20  No: 119929  IP: [192.*.*.*]

ちなみにVB6でWSH使うならこんなかんじ
    'Windows Scripting Host Object Modelを参照設定して
    Dim WSHShell   As New IWshShell_Class
    Dim oWshEcec As IWshRuntimeLibrary.WshExec
    Set oWshEcec = WSHShell.Exec("cmd.exe /C Dir c:\")
    MsgBox oWshEcec.StdOut.ReadAll

編集 削除
id_rsa++  2005-02-28 19:42:24  No: 119930  IP: [192.*.*.*]

Dim lpStartupInfo As STARTUPINFO

    With lpStartupInfo
        .cb = Len(lpStartupInfo)
        .dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
        .wShowWindow = SW_HIDE
        .hStdInput = hInpRead
        .hStdOutput = hOutWrite
        .hStdError = hErrWrite
    End With
    If (CreateProcess(vbNullString, Environ$("COMSPEC"), ByVal 0&, ByVal 0&, _
                        1&, 0&, ByVal 0&, App.Path, lpStartupInfo, lpProcInfo) = 0) Then MsgBox "えらー!"
でできたよ。

編集 削除
GG  2005-03-01 10:57:50  No: 119931  IP: [192.*.*.*]

すみませんでした
ネットの調子が悪く連絡取れませんでした

さるべーじさん、Sayさん、ガッさん、id_rsa++さん
ありがとうございました

今回のコマンドは、PINGだったので
さるべーじさんの教えてくれた
外部コマンドの方法でします

編集 削除
ガッ  2005-03-01 11:23:52  No: 119932  IP: [192.*.*.*]

> id_rsa++さんへ
さるべーじさんが教えて下さったリンク先のに突っ込んでみましたが、
やっぱりプロセスが作成できませんでした。
…んー;

編集 削除
id_rsa++  2005-03-01 19:33:30  No: 119933  IP: [192.*.*.*]

ガッさん汚いソースで良ければ、差し上げますがUPできる場所あります?メールでもいいけど。さすがに全部ここにコピペするのはシンドイです・・・

編集 削除
ガッ  2005-03-01 19:55:48  No: 119934  IP: [192.*.*.*]

> id_rsa++さん
んー、ソースが欲しいのもあるんですけど、あいにく公開できるアドレスの持ち合わせがありません;
大変残念ですが、どうもありがとうございました。

では。

※Win9xなら美味しく出来たのかも…んーむ。
  Sayさんが書いたWSHを使ったコードは問題なく動くので、
  …別プロセス空間で取得して、どこかに窓口設ければ簡単にできる…?
  ま、がんばりますw;

編集 削除
id_rsa++  2005-03-01 20:11:06  No: 119935  IP: [192.*.*.*]

ごめん。うちのサーバー忘れてた・・・
http://inaku-world.ddo.jp/vb-dos.zip
よかったら、参考にしてください。

編集 削除
ガッ  2005-03-01 20:27:56  No: 119936  IP: [192.*.*.*]

> id_rsa++さん
( ´Д`)<ぁΣ
…う、うう、動いたっ!?
スゴっ!ありがとうございますっ!!
大変参考になりました、大切に大切に解剖しますw(ぇ
本当にありがとうございました!

※さて、何で俺が書いたら動かなかったのやら…あははhhh
  あははhhhh…(TдT) アリガトウ

編集 削除