web-dev-qa-db-ja.com

VbScriptでコマンドラインをサイレントに実行し、出力を取得しますか?

コマンドラインからプログラムを実行できるようにしたいのですが、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ラインがポップアップするのは望ましくありません。助言がありますか?ありがとう

30
Onat

出力をファイルにリダイレクトしてから、ファイルを読み取ることができます。

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
35
Mark Cidade

これと他のさまざまなコメントを受け取り、アプリケーションを実行して出力を取得するためのもう少し高度な関数を作成しました。

関数を呼び出す例:ディレクトリに対してのみ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
10
Tony Wolf

@マーク・シダーデ

ありがとうマーク!これは、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に再び感謝します!

0
GTodorov

私はこのすべてにかなり慣れていますが、スクリプトがCScript.exe(コンソールスクリプティングホスト)経由で開始された場合、exec()でポップアップウィンドウが表示されないことがわかりました。

cscript myscript.vbs //nologo

myscript.vbsでの.Exec()呼び出しは余分なウィンドウを開きません。つまり、元のソリューションの最初のバリアントを(execを使用して)使用できます。

(上記のコードの2つのスラッシュは意図的なものであることに注意してください。cscript/?を参照してください)

0
Johannes Thoma