コマンドラインからプログラムを実行できるようにしたいのですが、VbScriptで起動したいのです。また、コマンドラインの出力を取得して変数に割り当てたいので、cmdウィンドウがポップアップすることなく、これらすべてをサイレントに実行したいと思います。私は2つのことを別々に管理しましたが、一緒には管理していません。これが私がこれまでに得たものです。 cmdからコマンドを実行し、出力を取得します。
Dim WshShell, oExec
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\snmpget -c public -v 2c 10.1.1.2 .1.3.6.1.4.1.6798.3.1.1.1.5.1")
x = oExec.StdOut.ReadLine
Wscript.Echo x
上記のスクリプトは動作し、cmdが少しの間ポップアップすることを除いて、私が望むことをします。
サイレントモードで実行されるが、出力を取得しないスクリプトを次に示します。
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("C:\snmpset -c public -v 2c -t 0 10.1.1.2 .1.3.6.1.4.1.6798.3.1.1.1.7.1 i 1", 0, true)
これら2つを連携させる方法はありますか?
なぜ私がこれをしたいのか、背景を説明します。私は基本的に5〜10分ごとにユニットをポーリングし、特定の条件が発生したときにスクリプトに電子メールを送信するか、メッセージボックスをスローしますが、コンピューターで1日中cmdラインがポップアップするのは望ましくありません。助言がありますか?ありがとう
出力をファイルにリダイレクトしてから、ファイルを読み取ることができます。
return = WshShell.Run("cmd /c C:\snmpset -c ... > c:\temp\output.txt", 0, true)
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("c:\temp\output.txt", 1)
text = file.ReadAll
file.Close
これと他のさまざまなコメントを受け取り、アプリケーションを実行して出力を取得するためのもう少し高度な関数を作成しました。
関数を呼び出す例:ディレクトリに対してのみC:\のDIRリストを出力します。出力は変数CommandResultsに返され、C:\ OUTPUT.TXTに残ります。
CommandResults = vFn_Sys_Run_CommandOutput("CMD.EXE /C DIR C:\ /AD",1,1,"C:\OUTPUT.TXT",0,1)
関数
Function vFn_Sys_Run_CommandOutput (Command, Wait, Show, OutToFile, DeleteOutput, NoQuotes)
'Run Command similar to the command Prompt, for Wait use 1 or 0. Output returned and
'stored in a file.
'Command = The command line instruction you wish to run.
'Wait = 1/0; 1 will wait for the command to finish before continuing.
'Show = 1/0; 1 will show for the command window.
'OutToFile = The file you wish to have the output recorded to.
'DeleteOutput = 1/0; 1 deletes the output file. Output is still returned to variable.
'NoQuotes = 1/0; 1 will skip wrapping the command with quotes, some commands wont work
' if you wrap them in quotes.
'----------------------------------------------------------------------------------------
On Error Resume Next
'On Error Goto 0
Set f_objShell = CreateObject("Wscript.Shell")
Set f_objFso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2, ForAppending = 8
'VARIABLES
If OutToFile = "" Then OutToFile = "TEMP.TXT"
tCommand = Command
If Left(Command,1)<>"""" And NoQuotes <> 1 Then tCommand = """" & Command & """"
tOutToFile = OutToFile
If Left(OutToFile,1)<>"""" Then tOutToFile = """" & OutToFile & """"
If Wait = 1 Then tWait = True
If Wait <> 1 Then tWait = False
If Show = 1 Then tShow = 1
If Show <> 1 Then tShow = 0
'RUN PROGRAM
f_objShell.Run tCommand & ">" & tOutToFile, tShow, tWait
'READ OUTPUT FOR RETURN
Set f_objFile = f_objFso.OpenTextFile(OutToFile, 1)
tMyOutput = f_objFile.ReadAll
f_objFile.Close
Set f_objFile = Nothing
'DELETE FILE AND FINISH FUNCTION
If DeleteOutput = 1 Then
Set f_objFile = f_objFso.GetFile(OutToFile)
f_objFile.Delete
Set f_objFile = Nothing
End If
vFn_Sys_Run_CommandOutput = tMyOutput
If Err.Number <> 0 Then vFn_Sys_Run_CommandOutput = "<0>"
Err.Clear
On Error Goto 0
Set f_objFile = Nothing
Set f_objShell = Nothing
End Function
@マーク・シダーデ
ありがとうマーク!これは、PHP WshShellからこれをどのように呼び出すべきか疑問に思っている数日間の研究を解決しました。
function __exec($tmppath, $cmd)
{
$WshShell = new COM("WScript.Shell");
$tmpf = Rand(1000, 9999).".tmp"; // Temp file
$tmpfp = $tmppath.'/'.$tmpf; // Full path to tmp file
$oExec = $WshShell->Run("cmd /c $cmd -c ... > ".$tmpfp, 0, true);
// return $oExec == 0 ? true : false; // Return True False after exec
return $tmpf;
}
私の場合、これが私にとってうまくいったことです。必要に応じて自由に使用および変更してください。関数内にいつでも機能を追加して、tmpファイルを自動的に読み取り、変数に割り当てたり、そのファイルを返したり、tmpファイルを削除したりできます。 @Markに再び感謝します!
私はこのすべてにかなり慣れていますが、スクリプトがCScript.exe(コンソールスクリプティングホスト)経由で開始された場合、exec()でポップアップウィンドウが表示されないことがわかりました。
cscript myscript.vbs //nologo
myscript.vbsでの.Exec()呼び出しは余分なウィンドウを開きません。つまり、元のソリューションの最初のバリアントを(execを使用して)使用できます。
(上記のコードの2つのスラッシュは意図的なものであることに注意してください。cscript/?を参照してください)