10

純粋に .bat ファイルでこれを行う方法はありますか?

目的は、 を起動iexplore.exeし、終了時にそのインスタンスだけを強制終了することです。

4

8 に答える 8

11

これが私が使用するものです:

@echo off

rem there is a tab in the file at the end of the line below
set tab=    
set cmd=javaw -jar lib\MyProg.jar
set dir=%~dp0

echo Starting MyProg
set pid=notfound

for /F "usebackq tokens=1,2 delims=;=%tab% " %%i in (
    `wmic process call create "%cmd%"^, "%dir%"`
) do (
    if /I %%i EQU ProcessId (
        set pid=%%j
    )
)

echo %pid% > MyProg.pid

ディレクトリは、cmd ファイルがあるディレクトリに設定されます。変更dirして変更します。変更cmdして、実行するコマンドを変更します。

それを殺す stop.cmd が必要な場合は、次のようになります。

@echo off
for /F %%i in (%~dsp0MyProg.pid) do taskkill /F /PID %%i
del %~dsp0MyProg.pid
于 2012-07-23T16:12:33.747 に答える
3

vbscript を使用できます。メモ帳を作成し、pid を使用して終了する例を次に示します。

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
errReturn = objProcess.Create("notepad.exe", null, objConfig, PID)
If errReturn = 0 Then
    WScript.Echo "Process ID is: " & PID
End If 

WScript.Echo "Ready to kill process: " & PID & "? [Y|y]"
Do While Not WScript.StdIn.AtEndOfLine
   strInput = strInput & WScript.StdIn.Read(1)
Loop
If LCase(strInput) = "y" Then
    WScript.Echo "Select * from Win32_Process Where ProcessId = '" & PID & "'"
    Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessId = '" & PID & "'")
    For Each objProcess in colProcessList
        objProcess.Terminate()
    Next
End If 

コマンド ラインで myscript.vbs として保存

c:\test> cscript /nologo myscript.vbs
于 2009-11-27T12:35:29.640 に答える
1

何らかの理由で、プロセス ID を取得するというあなたのアプローチはうまくいきませんでしたが、私はバッチの専門家なので、ここに添付して独自のアプローチをコーディングしました。

@echo off

call:AsyncCmd
rem call:AsyncCmd "echo hello world"
rem call:AsyncCmd "call build.bat"
exit /b

rem ------------------------------------------------------------------------------------------
rem Starts asynchronous command execution 
rem %1 is command, if empty - only aborts existing build.
rem ------------------------------------------------------------------------------------------
:AsyncCmd
if exist %~dp0SetupBuild_Completed.txt (
    del /f %~dp0SetupBuild_Pid.txt >nul 2>&1
    del /f %~dp0SetupBuild_Completed.txt >nul 2>&1
)

if not exist %~dp0SetupBuild_Pid.txt goto lStartProc
    rem --------------------------------------------------
    rem Abort build process
    rem --------------------------------------------------
    set /p pid=<%~dp0SetupBuild_Pid.txt
    echo Cancelling setup build process, process id %pid%
    pskill -t %pid%
    del /f %~dp0SetupBuild_Pid.txt >nul 2>&1

:lStartProc
if "%~1" == "" exit /b 0

rem --------------------------------------------------
rem Starts asyncronous build process
rem --------------------------------------------------
set dir=%~dp0
set dir=%dir:~0,-1%
for /f "tokens=2 delims==; " %%a in ('wmic process call create "cmd /c mincon.exe && %~1 && echo 1>%~dp0SetupBuild_Completed.txt"^, "%dir%" ^| findstr /r "ProcessId"') do set pid=%%a
echo Setup build started, process id: %pid%
echo %pid%>%~dp0SetupBuild_Pid.txt
exit /b 0
于 2013-05-01T06:07:16.517 に答える
1

うーん、TaskList & TaskKill ?!

于 2009-11-27T10:03:16.397 に答える
0

IEは実際にはタブごとに子プロセスを生成するため、単純なコマンドラインユーティリティではそれを行うことはできないと思います。つまり、IEがまだ実行されていない場合、タブの親IEプロセスと子プロセスが1つ取得され、IEがすでに実行されている場合は、単一の子プロセスを取得するだけです。

子 (タブ) プロセスを強制終了すると、IE は自動的にこのタブを回復するため、IE を強制終了するための独自のツールを作成する場合は、さらに注意が必要です。

この関連する質問も参照してください:新しく作成された IE8 ウィンドウのプロセスを取得する方法は? (そこには良い答えはありませんが)。

于 2009-11-27T10:17:31.797 に答える