0

.batファイルの実行結果が結果を返すかどうかをテストする必要があるシナリオ設定があります。.batファイルは別の.exeを呼び出し、.batファイルにはCMD DOSウィンドウがあり、.exeからそのDOSボックスに重大なエラー情報を出力します。.exeが正しく起動しない場合は、SQLDBで結果を確認できます。現在の.batファイルを閉じて再起動する必要があります。これはかなり単純なようです。WMI呼び出しを使用してProcessIDを取得できます。Terminate()コマンドでプロセスを終了できます。これは、テストに使用するすべての.exe(メモ帳、calc、iexplorerなど)で機能します。VBScriptを実行して.batファイルを強制終了すると、PIDが終了すると表示されます(PIDが表示されなくなったため)。ただし、DOSボックスは開いたままで、.batファイルから呼び出された.exeは実行されたままです。「X」をクリックすると DOSボックスで、またはタイトルバーを右クリックして[閉じる]を選択すると、DOSボックスと.exeの両方が強制終了されます。このスクリプトを正しく機能させるにはどうすればよいですか。サーバーはWindowsServer2003を実行しています(一部はx32で、その他はx64です)。何か案は?これが私のコードのバージョンです、いくつかの回転がありました:

If colFiles.Count = 0 Then
Wscript.Echo "The file does not exist on the remote computer."
Else
Wscript.Echo "The file exists on the remote computer."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objItem in colProcessList
If InStr(objItem.CommandLine, "r15_A.bat") Then
    Wscript.Echo "Batch file: " & objItem.CommandLine  & "  Process ID: " & objItem.ProcessID & "  Parent ID: " & objItem.ParentProcessID
    Call TerminateProcess(objItem.ParentProcessID)
    Call TerminateProcess(objItem.ProcessID)
End If
Next
dim shell
set shell=createobject("wscript.shell")
shell.run BATDIR & BATFILE
'set shell=nothing
End If


Function TerminateProcess(PID)

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Handle = '" & PID & "'")
For Each objProcess in colProcesses
On Error Resume Next
return = objProcess.Terminate()
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Handle = '" & PID & "'")

If Error Then

TerminateProcess = FALSE
Else
TerminateProcess = TRUE
msgBox colProcesses.Count
End If
Next

End Function

SendKeysを使用してALt-F4、X、Cなどを送信しようとしたこともあります。AppActivateは正しいDOSボックスを前面に表示します。

    Set WshShell = CreateObject("WScript.Shell")
    WshShell.AppActivate "r15_A"
    'WshShell.SendKeys("+{F10}")
    WshShell.SendKeys("C")   

前もって感謝します

編集--------------はい、この.batファイルが呼び出すプロセスを強制終了する必要があります。唯一の欠点は、このDOSボックスが開いたままになることです。迷惑ですが、私はそれと一緒に暮らすことができます。最後に、最初のスクリプトと同様のスクリプトを作成しましたが、コマンドラインパラメーターをチェックすることによって強制終了するインスタンスのみをチェックします:( "-FAIL.txt"テストを含むコードの最初のビットは、FAILファイルが存在するかどうかを確認します、そうである場合、残りのsciptsが実行されます)

Set colFiles = objWMIService. _
ExecQuery("Select * From CIM_DataFile Where Name = 'S:\\servers\\Logs\\" & LOGFILE & "-FAIL.txt'")

If colFiles.Count = 0 Then
'Wscript.Echo "The file does not exist on the remote computer."
Else
'Wscript.Echo "The file exists on the remote computer."
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'AppStart.exe'")
For Each objProcess in colProcessList
    IF instr(objProcess.CommandLine, "robo05-A") > 0 THEN 
        'msgBox "Found text"
        objProcess.Terminate()
        'This part restarts the failed .bat file.
        wscript.sleep (200) 
        dim shell
        set shell=createobject("wscript.shell")
        shell.run BATDIR & BATFILE
        'set shell=nothing
    ELSE
        'msgBox "Not found"
    END IF
Next
End If
4

1 に答える 1

0

あなたが持っている問題は、バッチファイル内から呼び出されている実行可能ファイルがまだ実行されていることです。私はバットであなたのセットアップを再現しようとしましたping -t %computername%、そして確かに、vbscriptはcmd.exeを強制終了しましたが、pingは強制終了しませんでした(親PIDはexplorer.exeであったため、おそらくそれを強制終了したくないことに注意してください)。これで、タスクマネージャーからping.exeを簡単に強制終了してウィンドウを閉じることができました...しかし、バットが何をしていて何が開いたままになっているのかを知っていたので、それを行うことしかできませんでした。「ping.exe」を含むプロセスのWMI検索を実行し、PIDを取得してから閉じることができます。これは、基本的に同じことを実行します。もちろん、あなたの状況では、「ping.exe」はおそらく私のものと同じ実行可能ファイルではありません。exeが時々変更される場合は、プロセスからコマンドラインを取得して、r15_A.batファイルへのファイルパスを含むパラメーターを見つけ、filesystemobjectを使用してこのbatファイルを開きます。

于 2009-03-24T21:13:51.223 に答える