Windows スクリプト (.vbs) を使用して、コマンド ライン (cmd.exe) から単純なコマンドの結果を取得したいと考えています。これはどのように行われますか?良い/簡単な例や説明を見つけることができませんでした。「date」または「time」コマンドを使用して例を提供できます。そのような:
PS cmd.exe を開いてコマンドを送信するスクリプト コードを記述できます。
ありがとう!
疑わしい場合は、ドキュメントをお読みください。あなたはおそらくこのようなものが欲しいでしょう:
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
。