Назад | Перейти на главную страницу

Переменная DOS Set доступна только после выполнения

У меня очень простой сценарий, в котором я хочу взять значение из текстового документа (одна строка, одно значение) и передать его в taskkill - он тоже должен быть однострочным, поэтому у меня есть:

set /p pidtokill=<C:\temp\pid.txt && taskkill /F /PID %pidtokill% 

Проблема в том, что переменная pidtokill обновляется только ПОСЛЕ выполнения команды taskkill, например если я запустил команду дважды, тасккилл сработает, но в первый раз она будет использовать предыдущее значение, хранящееся в переменной ... почему значение pidtokill не установлено "вовремя" для команды taskkill?

Вы наблюдаете "именно так, как работает" (см. раздел «Несколько команд в одной строке»).

В пакетном файле поведение по умолчанию - читать и расширять переменные по одной строке за раз, если вы используете & для запуска нескольких команд в одной строке, то любые изменения переменных не будут видны, пока выполнение не перейдет к следующей строке

Если вы хотите, чтобы это работало, вам нужно поместить «однострочник» в пакетный файл, а затем использовать «SETLOCAL EnableDelayedExpansion». Конечно, в этот момент вы могли бы просто сделать это в две строчки.

Если вы не привязаны к пакетным файлам, в Powershell вы можете сделать это одной строкой без переменных: Stop-Process -Id (Get-Content c:\temp\pid.txt)