Как определить переменную среды PATH после выполнения cmd / c «команды»? - PullRequest
0 голосов
/ 15 января 2012

Я хочу определить, какой была переменная среды PATH после выполнения командного файла (vcvarsall.bat), запустив

cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%"

, но это не то, что я ожидаю.Например, если я запускаю:

cmd /c "set PATH=test && echo %PATH%"

, я просто получаю PATH хост-процесса, а не "test", как я ожидал, так как echo% PATH% должен выполняться в контексте дочернего процесса,не родитель.Итак, почему это происходит, и как мне добиться результата, которого я добиваюсь?

Ответы [ 3 ]

3 голосов
/ 15 января 2012
cmd /c "set PATH=test && echo %PATH%"

будет интерпретировать PATH до того, как будет изменено.Это на самом деле изящный трюк для экспорта переменных среды вне блока setlocal/endlocal с помощью:

ste xyzzy=twisty
startlocal
set xyzzy=plugh
endlocal && set xyzzy=%xyzzy%

Обычно (без бита && xyzzy=... переменная xyzzy все равно будет исходным значением twistyпосле блока, но тот факт, что %xyzzy% интерпретируется перед всей строкой endlocal, в то время как set действует после команды endlocal, позволяет экспортировать изменение.

Если вы хотите интерпретировать переменную после set, вам нужно отложенное расширение:

cmd /v:on /c "set PATH=test && echo !PATH!"

/v:on включает отложенное расширение и использование ! вместо %означает, что вы хотите использовать это отложенное расширение.

2 голосов
/ 15 января 2012

Решение paxdiablo не будет работать, если оно используется, если в родительской среде включено отложенное расширение.

из командного файла

@echo off
setlocal enableDelayedExpansion
rem !PATH! below will get expanded in parent batch environment
cmd /v:on /c "set PATH=test && echo !PATH!"

или из командной строки

cmd /v:on
rem !PATH! below will get expanded in parent batch environment
cmd /v:on /c "set PATH=test && echo !PATH!"

Простое решение состоит в том, чтобы избежать расширения, чтобы оно было отложено до тех пор, пока вы не окажетесь в новой среде cmd.

cmd /v:on
rem This works whether or not delayed expansion is enabled in the parent environment
cmd /v:on /c "set PATH=test && echo ^!PATH^!"

Обратите внимание, что / v: on все еще требуется во 2-м cmd, поскольку cmd не наследует состояние отложенного расширения от родительской среды.

1 голос
/ 15 января 2012

Вы укушены немедленным расширением переменных .

cmd.exe не очень хороший язык сценариев.

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