2009-03-23 38 views
0

私は、.batファイル実行の結果が結果を返したかどうかを確認するためにテストする必要があるシナリオセットアップがあります。 .batファイルは別の.exeを呼び出し、.batファイルは.exeからそのDOSボックスに重大なエラー情報を出力するCMD DOSウィンドウを持っています。 .exeが正しく起動しない場合は、SQL DBで結果を確認できます。私は現在の.batファイルを閉じて再起動する必要があります。 これはかなりシンプルなようですが、WMI呼び出しを使用してProcessIDを取得できます。 Terminate()コマンドでプロセスを終了できます。メモ帳、calc、iexplorerなど。私がVBScriptを実行して.batファイルを終了すると、PIDを終了します(これはPIDがもう見えないため)ただし、DOSボックスはまだ開いており、.batファイルから呼び出された.exeはまだ実行されています。 DOSボックスで "X"をクリックするか、タイトルバーを右クリックして "閉じる"を選択すると、DOSボックスと.exeがともに殺されます。このスクリプトを正しく動作させるにはどうすればよいですか。サーバーはWindows Server 2003を実行しています(一部はx32、その他はx64)。何か案は?ここに私のコードのバージョンがあり、いくつかの回転数があった:.batファイルによって開始されたVBScript終了プロセス

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 

私もALT-F4、X、C、などを送信するためのSendKeysを使用しようとしました:AppActivateのは正しいDOSボックスを持っていフロント。事前に

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

おかげ

EDIT -------------- はい、私は、プロセス、この.BATファイルの呼び出しを殺すために持っているつもりです。このDOSボックスは開いたままです。迷惑だが、私はそれで生きることができる。最後に私は最初のスクリプトに似たスクリプトを書いたが、CommandLineパラメータをチェックすることで殺したいインスタンスをチェックするだけだ:(FAILファイルが存在するかどうかを調べるための "-FAIL.txt"それがある場合、その後、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 

答えて

0

問題、あなたが持つは、バッチファイル内から呼び出されている実行ファイルがまだ実行されています。私はちょうどping -t %computername%をしたバットであなたの設定を作り直そうとしましたが、vbscriptはcmd.exeを殺しましたが、pingを殺していませんでした(親PIDはexplorer.exeでしたので、おそらく殺しを試みたくありませんそれ)。今すぐウィンドウを閉じたタスクマネージャからping.exeを簡単に削除することができました...しかし、私はバットが何をしているのか、何が残っているのか分かっていたので、それだけを知っていました。 「ping.exe」を含むプロセスをWMIで検索し、PIDを取得して閉じ、基本的には同じことをします。もちろん、あなたの状況では "ping.exe"はおそらく私と同じ実行可能ファイルではありません。 exeファイルが毎回変更された場合は、プロセスからコマンドラインを取得してr15_A.batファイルへのファイルパスを含むパラメータを見つけ、filesystemオブジェクトを使用してこのbatファイルを開き、それが呼び出す実行ファイルを探しますおそらくまだ実行しているし、それらを殺す....しかし、実際にあなたが達成しようとしているもののために残忍かもしれません。

関連する問題