2016-03-26 6 views
0

私は自分の仕事用PCを起動するたびに私が使用するバッチファイルを持っています。基本的には、IT部門が私のユーザーアカウントとして実行するPCに置くすべてのbloatwareを使用しないでください。使用しない場合は、小さなプログラムをインストールして、実際に必要なすべてのプログラムを一度に読み込みます。問題は、私が走っているプログラムの1つですが、IT部門は最近、私がすでにやっていることを知っているプログラムの中のいくつかを自動化するための "ヘルパー"プログラムをインストールすると役に立ちます。問題は、ヘルパープログラムが実際に逆効果を持ち、実際のプログラムが遅くなることです。私たちはもちろん、それについてITに苦情を言い渡していますが、それを修正するには数ヶ月かかるでしょう。その間、ヘルパープログラムは自分のユーザーアカウントの下で自分のプロセスとして実行されることが分かりました。つまり、私はそれを強制終了でき、すべてがスムーズに実行されます。問題は、プログラムの実行方法です。プログラムを正常に起動すると、次のようになります。続行する前に別のプロセスが終了するまでバッチファイルを待機します

プロセスAが読み込まれます。プロセスAはプロセスBをロードする。プロセスAはそれ自身を殺す。プロセスBはプロセスCをロードする。プロセスCはプロセスD、E、F(ヘルパープログラム)をロードする。プロセスBは、C、D、E、Fをメモリに残したままで、自分自身を殺します(プログラムはこの時点で完全にロードされています)。

バッチファイルはプロセスBが自分自身を殺すのを待つことができます。 taskkillプロセスD、E、Fを終了するコマンド?コマンドラインはEXEを直接呼び出すときにプロセスAしか見ることができないため、Aはすぐにそれを殺すので、1秒以内にバッチファイルを再開します。私はちょうどtimeoutまたは何か他の一般的な時間の浪費を使用することはできません。プログラムの読み込み時間があまりにも揮発性で、ネットワーク上の問題、プログラムの更新などの理由で。

+0

あなたはSysInternalsの 'PsKill'​​ユーティリティを見てみたいことがあります。' \tキルプロセスとそのdescendants.'リンクを-t:https://technet.microsoft.com/en-us/sysinternals/pskill –

+0

'taskkill'はすでにプロセスを終了させることができ、/ tスイッチを使って終了します。プロセスCは実際のプログラムであり、開かれたままにする必要があります。さらに、すべてがロードされた後、タスク階層は残っていません。 – modemman11

+0

'プロセスCは実際のプログラムであり、開いたままにする必要があります。 「タスク階層は残っていません」D、E、Fは階層構造ではないのですか?それとも、私はその質問を誤解しましたか? –

答えて

0

本当にありがとうございました。私は実際にルスランの答えを取り、簡略化して少し変更しました。これは素晴らしいです。 exe3が最後にロードされてからロードされるのを待ってから3をすべて終了します。それらの変数を削除する必要はなく、ループに入れることを完全に忘れました。

:start 
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq exe3.exe"') DO IF %%x == exe3.exe goto found 
goto start 
:found 
taskkill /f /fi "blah1.exe" 
taskkill /f /fi "blah2.exe" 
taskkill /f /fi "blah3.exe" 
0

私は数年前と全く同じように残念ながら私のコードはありませんし、現時点ではWindowsマシンにアクセスすることはできません。

しかし、これはかなり単純なものでなければならず、これらの行に沿っている必要があります。問題があるかどうかを知るためにコードを微調整するだけでテストできませんが、修正する必要があります私は)彼らが何であるかを知っている場合:

rem Usage: :killprocesswithwait [pid] 
call :killprocesswithwait 1234 

:killprocesswithwait 
set pid=%1 
taskkill /pid %pid% 
:iloop 
ping 127.0.0.1 -n 2 > nul 
for /f "tokens=*" %%a in ('tasklist /fi "PID eq %pid%" ^| find /i %pid%') do (
    if /i "%%a"=="" (
     goto :eof 
    ) else (
     goto :iloop 
    ) 
) 
0

これは、メモ帳があれば、すべて終了するには、プログラムや小切手を待ち、それがある場合は、それを再起動します。

3つのプログラムが起動するのを待つ方がいいでしょう。 Win32_ProcessStopTraceWin32_ProcessStartTraceに変更してください。

Set WshShell = WScript.CreateObject("WScript.Shell") 
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _ 
    ("SELECT * FROM Win32_ProcessStopTrace") 

Do 
    Set objReceivedEvent = objEvents.NextEvent 
    msgbox objReceivedEvent.ProcessName 
    If lcase(objReceivedEvent.ProcessName) = lcase("Notepad.exe") then 
     Msgbox "Process exited with exit code " & objReceivedEvent.ExitStatus 
     WshShell.Run "c:\Windows\notepad.exe", 1, false 
    End If 
Loop 

これは、プロセスをリストし、呼び出された電卓を終了します。

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") 

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process") 

For Each objItem in colItems 
    'msgbox objItem.ProcessID & " " & objItem.CommandLine 
    If objItem.name = "Calculator.exe" then objItem.terminate 
Next 
0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q36241667.txt" 
SET "filename2=%sourcedir%\q36241667_2.txt" 

:dloop 
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
tasklist|FIND "%%a" >NUL 
IF ERRORLEVEL 1 timeout /t 1 >nul&GOTO dloop 
) 

FOR /f "usebackqdelims=" %%a IN ("%filename2%") DO ECHO(%%a 

GOTO :EOF 

あなたの状況に合わせてsourcedirの設定を変更する必要があります。

私は、私のテストにいくつかのダミーデータを含むq36241667.txt & q36241667_2.txtという名前のファイルを使用しました。

と仮定filename1は、すべてのプロセスを進める前に実行されているまで、forループが待機する

processa.exe 
processb.exe 
processc.exe 
processd.exe 
processe.exe 

が含まれています。このルーチンは、スタートアップルーチンで単にstart EDであれば

filename2

は、それ自体が不要なプロセスを殺すために startのコマンドをトリガすることができ、必要なキルコマンド(デモの目的のために echo編)

が含まれています。

私は同様のルーチンを使用して、重要なディレクトリをスタートアップ時のラムスティックにバックアップします。

関連する問題