Вы можете захватить PID вызываемого процесса или файл, который нужно открыть с помощью WMIC, и установить идентификатор процесса в переменной, а затем использовать эту переменную с TASKKILL с помощью переключателя /PID
который я разместил в примере пакетного сценария ниже, а затем еще один ниже, основанный на вашей логике, как я думаю, это должно вписываться в него, но корректировать соответственно по мере необходимости.
Эта логика создает пару динамических временных файлов, используя FOR /F для анализа идентификатора процесса, который передается во временный файл, чтобы захватить только числовое значение, которое будет использоваться с TASKKILL для уничтожения этого конкретного идентификатора процесса (т.е. переключатель /PID
).
Эта логика делает следующее:
- Открывает процесс \ файл
- Ждет час
- Закрывает только тот экземпляр процесса \ открытый файл
Пример пакетного скрипта
(Запустите процесс, запишите идентификатор процесса [PID] этого процесса, а затем уничтожьте этот процесс на основе того же идентификатора процесса)
Этот сценарий устанавливает переменную приложения и может потребоваться указать полный путь к приложению на компьютере (SET App=
) и полный путь к файлу, который откроет это приложение, и т.д. (SET AppFile=
).
@ECHO ON
:::SET App=C:\Program Files\Microsoft Office 15\root\office15\WINWORD.EXE
SET App=%windir%\%Notepad.exe
:::SET AppFile=C:\Users\User\Desktop\Test\ENTER_EXIT_List.docx
SET AppFile=C:\Users\User\Desktop\Test\List.txt
SET DynamicTempFile1=%temp%\~tmpProcessID1_%~nx0.dat
SET DynamicTempFile2=%temp%\~tmpProcessID2_%~nx0.dat
IF EXIST "%DynamicTempFile1%" DEL /Q /F "%DynamicTempFile1%"
IF EXIST "%DynamicTempFile2%" DEL /Q /F "%DynamicTempFile2%"
::start a process and pass it a file, etc. to open or process and then pipe the process ID to a temp file
WMIC PROCESS CALL CREATE "%App% %AppFile%" | FIND "ProcessId">>"%DynamicTempFile1%"
::parse out unneeded characters for only numeric values from temp file
FOR /F "DELIMS==; TOKENS=2" %%F IN (%DynamicTempFile1%) DO ECHO %%~F >> "%DynamicTempFile2%"
::sets the PID to a variable with the value in the temp file
SET /P processid= < %DynamicTempFile2%
::wait 3600 seconds or one hour and then run the taskkill command
PING /n 3600 127.0.0.1 > nul
::kill process by PID from the previously set variable
TASKKILL /PID %processid%
GOTO EOF
Дополнительные ресурсы
Пример сценария на основе вашей логики
Это предполагает, что вы открываете и убиваете файл, который копируется, но просто устанавливаете переменную вверху.
ECHO OFF
::://Set application full path and the app file full path that the app will open
:::SET App=%windir%\%Notepad.exe
:::SET AppFile=C:\Users\User\Desktop\Test\List.txt
SET App=C:\Program Files\Microsoft Office 15\root\office15\WINWORD.EXE
SET DesktopFolder=C:\Users\<USERNAME>\Desktop
::SET AppFile=%DesktopFolder%\file.doc
SET AppFile=C:\Users\<USERNAME>\Desktop\file.doc
SET CopyFile=T:\Shared\file.doc
SET DynamicTempFile1=%temp%\~tmpProcessID1_%~nx0.dat
SET DynamicTempFile2=%temp%\~tmpProcessID2_%~nx0.dat
IF EXIST "%DynamicTempFile1%" DEL /Q /F "%DynamicTempFile1%"
IF EXIST "%DynamicTempFile2%" DEL /Q /F "%DynamicTempFile2%"
CLS
ECHO.
TIMEOUT /T 10 /NOBREAK
ECHO.
:start
ECHO.
ECHO Updating File...
ECHO.
COPY /Y "%CopyFile%" "%DesktopFolder%"
ECHO.
ECHO.
TIMEOUT /T 2
ECHO.
ECHO Opening File
ECHO.
:::START "File" "file.doc"
::start a process and pass it a file, etc. to open or process and then pipe the process ID to a temp file
WMIC PROCESS CALL CREATE "%App% %AppFile%" | FIND "ProcessId">>"%DynamicTempFile1%"
::parse out unneeded characters for only numeric values from temp file
FOR /F "DELIMS==; TOKENS=2" %%F IN (%DynamicTempFile1%) DO ECHO %%~F >> "%DynamicTempFile2%"
::sets the PID to a variable with the value in the temp file
SET /P processid= < %DynamicTempFile2%
ECHO.
ECHO Waiting For One Hour...
ECHO.
TIMEOUT /T 3600
ECHO.
ECHO Deleting Old File
ECHO.
::kill process by PID from the previously set variable
TASKKILL /PID %processid%
DEL /Q /F "%AppFile%"
GOTO start