У меня очень простой сценарий, в котором я хочу взять значение из текстового документа (одна строка, одно значение) и передать его в 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)