Ответ 1
ОК, это заняло немного, но я думаю, что понял это. Попробуйте следующее:
SET UNDEFINED 2>Nul | Findstr/I "."
IF ERRORLEVEL 1 ECHO Not Defined.
Это работает для всех случаев AFAIK и не зависит от каких-либо функций расширения команд.
Мне нужно использовать командную строку cmd.exe(cmd.exe вызывается из инструмента построения gyp), чтобы определить, определена ли переменная среды или нет. Как я могу это сделать? Я в порядке, полагая, что значение переменной не содержит одиночных или двойных кавычек, но не может предполагать, что расширения команд включены.
Я пробовал следующее, которое отлично работает в .bat файле, но сбой при вводе непосредственно в командной строке:
IF "%UNDEFINED%" == "" (echo yes)
Когда эта точная строка находится в файле .bat и выполняется, я вижу в качестве вывода yes
. Когда я ввожу его в командной строке, вывод пуст. Я тестирую это на Windows XP SP3, хотя мой коллега видит те же результаты в Windows 7. Это метод, предложенный http://support.microsoft.com/kb/121170 и http://www.robvanderwoude.com/battech_defined.php. Я не хочу использовать IF DEFINED UNDEFINED (echo yes)
, потому что это не будет работать, если расширения команд отключены.
Самый верный ответ в следующем сообщении привел меня к мысли, что эта проблема связана с тем, как процентное расширение обрабатывается по-разному в "CmdLineParser" по сравнению с "BatchLineParser", но до сих пор не привело меня к решение: Как интерпретатор сценариев Windows Command Interpreter (CMD.EXE)?
ОК, это заняло немного, но я думаю, что понял это. Попробуйте следующее:
SET UNDEFINED 2>Nul | Findstr/I "."
IF ERRORLEVEL 1 ECHO Not Defined.
Это работает для всех случаев AFAIK и не зависит от каких-либо функций расширения команд.
Errr... just:
if defined your-var-name (
echo yarp
) else (
echo narp
)
Я должен добавить, я не верю, что для этого нужны расширения команд...
Если расширения действительно отключены (я не могу в это поверить),
то вы можете попробовать по-разному.
IF %UNDEFINED% == %^UNDEFINED% (echo yes)
Это работает так, как будто undefined
не существует, но не заменяется, также ^undefined
, но каретка будет удалена в следующей фазе парсера, поэтому %undefined%
сравнивается с %undefined%
.
Недостатком является отсутствие котировок, так как они также делают выражение устойчивым к специальным символам.
Лучше всего использовать IF defined
, но если расширения отключены, вам нужно сначала включить их.
cmd /E:on /c "if not defined undefined echo It undefined"
Лучший способ - просто использовать пакетный файл, который также должен работать с системой сборки gyp.
Я пробовал это, и он работал:
@echo off
setlocal disableextensions
set x=%path%
if "%x%"=="" (echo "PATH" does not exist) else (echo "PATH" exists)
set x=%pathx%
if "%x%"=="" (echo "PATHX" does not exist) else (echo "PATHX" exists)
endlocal
Он вернул:
"PATH" exists
"PATHX" does not exist