2012-01-15 2 views
0

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

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

но что происходит не то, что я ожидал. Например, если я бегу:

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

Я просто получить путь к хост-процесса, а не «тест», как я ожидал, что эхо% PATH% должен быть запущен в контексте дочернего процесса, а не родитель. Итак, почему это происходит, и как мне добиться результата, который я получил?

ответ

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

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

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

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

Если вы хотите, чтобы интерпретировать переменный после set, у НУ нужно замедленное расширение:

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

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

+0

Не удалось, если отсроченное расширение уже включено - см. [Мой ответ] (http://stackoverflow.com/a/8870200/1012053) – dbenham

1

Вас укусят immediate expansion of variables.

cmd.exe не является хорошим языком для написания сценариев.

+0

cmd.exe вообще не является языком сценариев. –

2

Решение 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: по-прежнему требуется в 2 ЦМД, потому что CMD не наследует состояние отсроченного расширения от родительской среды.

Смежные вопросы