7

Windows スクリプト (.vbs) を使用して、コマンド ライン (cmd.exe) から単純なコマンドの結果を取得したいと考えています。これはどのように行われますか?良い/簡単な例や説明を見つけることができませんでした。「date」または「time」コマンドを使用して例を提供できます。そのような:

ここに画像の説明を入力

PS cmd.exe を開いてコマンドを送信するスクリプト コードを記述できます。

ありがとう!

4

1 に答える 1

10

疑わしい場合は、ドキュメントをお読みください。あなたはおそらくこのようなものが欲しいでしょう:

Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t")
Do While p.Status = 0
  WScript.Sleep 100
Loop
WScript.Echo p.StdOut.ReadAll

編集:使用Exec()する場合、入力を経由では.StdInなく記述子を介して渡しますSendKeys()(これはとにかく入力を渡すためのかなり信頼性の低い方法です)。

%COMSPEC%はへのフルパスを持つシステム環境変数でcmd.exeあり、/cオプションはcmd.exeコマンド(date /t例では)が終了した後に終了します。

コマンドが終了コードで成功/失敗を示している場合はExitCode、コマンドの終了後にプロパティを確認できます。

If p.Status <> 0 Then WScript.Echo p.ExitCode

Edit2:atprogramインタラクティブに使用する代わりに、ユーザーの操作なしで特定のタスクを実行するコマンドラインを構築できますか?非対話型のコマンドラインでは、次のようなものが機能する可能性があります。

prompt = "C:\>"
atprogram_cmdline_1 = "atprogram.exe ..."
atprogram_cmdline_2 = "atprogram.exe ..."
'...

Function ReadOutput(p)
  text = ""
  Do Until Right(text, Len(prompt)) = prompt
    text = text & p.StdOut.Read(1)
  Loop
  ReadOutput = text
End Function

Set cmd = CreateObject("WScript.Shell").Exec("%COMSPEC% /k")
ReadOutput cmd  ' skip over first prompt

cmd.StdIn.WriteLine(atprogram_cmdline_1)
WScript.Echo ReadOutput(cmd)
cmd.StdIn.WriteLine(atprogram_cmdline_2)
WScript.Echo ReadOutput(cmd)
'...

cmd.Terminate  ' exit CMD.EXE

%COMSPEC% /kコマンドを実行せずにコマンドプロンプトを生成します。はそれが閉じるの/kを防ぎます。While p.Status = 0自動的に閉じないため、ここでループを使用することはできません。WScript.Sleepコマンドが完了するまでに時間がかかる場合は、数秒かかる必要があります。

を介して、インスタンスcmd.StdIn.WriteLineでコマンドラインを実行できます。CMDこの関数は、次のプロンプトが表示されるまでReadOutput()の出力を読み取ります。StdOut読み取り操作がブロックされているため、プロンプトを探す必要があります。そのため、「まだ印刷されているものをすべて読み取る」と単純に言うことはできません。

CMD.EXE終了したら、を介して終了しますcmd.Terminate

于 2012-10-01T20:14:27.627 に答える