Не удается очистить содержимое переменной set / p в командном файле приглашения win 7 cmd - PullRequest
1 голос
/ 17 июня 2019

У меня есть командный файл, который должен убивать процессы, которые соответствуют ключевому слову.Вот мой командный файл:

@echo off
REM tkill.bat  
IF [%1] == [] GOTO Syntx

tasklist | find /i "%1%" > ttt.txt
set /p line=<ttt.txt
for /f %%G in ("%line%") do set "pp=%%G"

if [%pp] == [] GOTO endit
taskkill /f /im %pp%
del ttt.txt
goto endit

:syntx
echo Syntax:
echo   tkill partial_process_name
:endit
set line=

Допустим, я хочу уничтожить все процессы браузера Opera.Итак, я запускаю:

tkill opera

и получаю этот вывод

C:\Windows\system32>tkill opera
SUCCESS: The process "opera.exe" with PID 3572 has been terminated.
SUCCESS: The process "opera.exe" with PID 9320 has been terminated.
SUCCESS: The process "opera.exe" with PID 6628 has been terminated.
SUCCESS: The process "opera.exe" with PID 2220 has been terminated.
SUCCESS: The process "opera.exe" with PID 4184 has been terminated.
SUCCESS: The process "opera.exe" with PID 5816 has been terminated.
SUCCESS: The process "opera.exe" with PID 9816 has been terminated.
SUCCESS: The process "opera.exe" with PID 7416 has been terminated.
SUCCESS: The process "opera.exe" with PID 684 has been terminated.
SUCCESS: The process "opera.exe" with PID 4688 has been terminated.

Итак, я проверяю, есть ли какие-то процессы-отставатели

C:\Windows\system32>tasklist | find /i "opera"

C:\Windows\system32>

Их нет.Затем я снова запускаю ту же команду и вижу результат:

tkill opera
ERROR: The process "opera.exe" not found.

Вот моя проблема: в памяти нет процесса с именем opera.exe.Следовательно, моя команда tasklist | find /i "%1%" > ttt.txt должна привести к пустому файлу.Тем не менее, имя opera.exe где-то застревает до тех пор, пока я не закрою приглашение dos и не открою новое, или не выполнил ту же команду с другим именем процесса, которое фактически выполнялось, и был убит.Затем новое имя застревает в памяти, например:

C:\Windows\system32>tkill notepad.exe
SUCCESS: The process "notepad.exe" with PID 5952 has been terminated.

C:\Windows\system32>tkill notepad.exe
ERROR: The process "notepad.exe" not found.

C:\Windows\system32>tkill neon
ERROR: The process "notepad.exe" not found.

C:\Windows\system32>

В моем понимании чего-то не хватает, как присваиваются переменные Windows, но чего не хватает, я не могу понять.Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Поскольку было бы слишком проблематично разрешить этой программе совпадать с входной строкой в ​​любом месте любого запущенного процесса, я бы предложил гораздо более простой синтаксис в вашем файле tkill.bat:

@If "%~1"=="" (Echo Syntax:&Echo   tkill partial_process_name)Else TaskKill /Fi "ImageName Eq %~1*" /F /T

Вы можете разбить вышеперечисленное на несколько строк для удобства чтения, если хотите:

@Echo Off
If "%~1"=="" (
    Echo Syntax:
    Echo   tkill partial_process_name
) Else TaskKill /Fi "ImageName Eq %~1*" /F /T

Для этого не требуется записывать, читать и удалять файлы, а также определять переменные или иным образом. Также нет опоры на find.exe (тем более, что опция ImageName Eq уже без учета регистра) . Вы также заметите, что нет необходимости проверять вывод из Tasklist, чтобы использовать TaskKill, если соответствующий процесс не найден, он не может его «убить» и выдаст сообщение INFO:, чтобы Вы знаете, (вместо ERROR: сообщения, которое вы в настоящее время получаете.) .

0 голосов
/ 17 июня 2019

Протестировано

Попробуйте добавить setlocal и endlocal к сценарию.

Это также будет нормально работать с использованием setlocal enabledelayedexpansion и использованием !, когдаобязательно.

@echo off
setlocal
REM tkill.bat

IF [%1] == [] GOTO Syntx

tasklist | find /i "%1%" > ttt.txt
set /p line=<ttt.txt
for /f %%G in ("%line%") do set "pp=%%G"
if [%pp] == [] GOTO endit
taskkill /f /im %pp%
del ttt.txt
endlocal
goto endit

:syntx
echo Syntax:
echo   tkill partial_process_name

:endit
set line=

Если нет, то pp создается как переменная среды и, вероятно, будет хранить последний найденный процесс.

Дополнительный необязательный подробный текст:

В оригинале batch, pp всегда сохраняется последний найденный процесс.Но обратите внимание, что если мы сделаем три одинаковых и последовательных выполнения, только во второй раз выполняется скрипт.Отсроченное расширение не включено, оно будет принимать значение pp во время разбора, а не во время выполнения.Поскольку во второй раз выполняется set pp=, потому что процесс не найден.В третий раз оригинальный скрипт будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...