it-swarm.com.de

Überprüfen Sie, ob eine Umgebungsvariable ohne Befehlserweiterungen und ohne Verwendung einer Batchdatei definiert ist.

Ich muss eine cmd.exe-Befehlszeile verwenden (cmd.exe wird vom Gyp-Build-Tool aufgerufen), um festzustellen, ob eine Umgebungsvariable definiert ist oder nicht. Wie kann ich das machen? Ich gehe davon aus, dass der Variablenwert keine einfachen oder doppelten Anführungszeichen enthält, kann aber nicht davon ausgehen, dass Befehlserweiterungen aktiviert sind.

Ich habe Folgendes ausprobiert, was in einer .bat-Datei hervorragend funktioniert, aber bei direkter Eingabe in der Befehlszeile fehlschlägt:

IF "%UNDEFINED%" == "" (echo yes)

Wenn genau diese Zeile in einer .bat-Datei enthalten ist und ausgeführt wird, sehe ich yes als Ausgabe. Wenn ich es in die Befehlszeile eingebe, ist die Ausgabe leer. Ich teste dies unter Windows XP SP3, obwohl mein Kollege die gleichen Ergebnisse unter Windows 7 sieht. Dies ist die von http://support.Microsoft.com/kb/12117 und http://www.robvanderwoude.com/battech_defined.php Ich möchte IF DEFINED UNDEFINED (echo yes) nicht verwenden, da dies nicht funktioniert, wenn Befehlserweiterungen vorhanden sind deaktiviert.

Die am häufigsten gewählte Antwort im folgenden Beitrag hat mich zu der Annahme veranlasst, dass dieses Problem damit zusammenhängt, wie die prozentuale Erweiterung im "CmdLineParser" anders gehandhabt wird als im "BatchLineParser", aber mich immer noch nicht zu einer Lösung geführt hat: Wie parst der Windows Command Interpreter (CMD.EXE) Skripte?

37
Johann

OK, das hat ein bisschen gedauert, aber ich glaube, ich habe es herausgefunden. Versuche dies:

SET UNDEFINED 2>Nul | Findstr/I "."
IF ERRORLEVEL 1  ECHO Not Defined.

Dies funktioniert in allen AFAIK-Fällen und ist nicht auf Befehlserweiterungsfunktionen angewiesen.

7
RBarryYoung

Errr ... nur:

if defined your-var-name ( 
    echo yarp
) else (
    echo narp
)

Ich sollte hinzufügen, ich glaube nicht, dass dies Befehlserweiterungen benötigt ...

33
Simon Catlin

Wenn die Erweiterungen wirklich deaktiviert sind (ich kann das nicht glauben),
dann können Sie verschiedene Möglichkeiten ausprobieren.

IF %UNDEFINED% == %^UNDEFINED% (echo yes)

Dies funktioniert so, als ob undefined nicht existiert, dann wird es nicht ersetzt, auch ^undefined, Aber das Caret wird in der nächsten Parser-Phase entfernt, sodass %undefined% Mit verglichen wird %undefined%. Der Nachteil sind die fehlenden Anführungszeichen, da sie den Ausdruck auch gegen Sonderzeichen stabil machen.

Ein besserer Weg ist die Verwendung von IF defined, Aber wenn Erweiterungen deaktiviert sind, müssen Sie sie zuerst aktivieren.

cmd /E:on /c "if not defined undefined echo It's undefined"

Der beste Weg ist, einfach eine Batch-Datei zu verwenden, die auch mit dem Gyp-Build-System funktionieren sollte.

9
jeb

Ich habe es versucht und es hat funktioniert:

@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

Es kam zurück:

"PATH" exists
"PATHX" does not exist
5
James L.
IF NOT %CODE%==? do stuff.

Dies funktioniert auf einer W98-Befehlszeile und in einer Batch-Datei. Daher sollte es von MS-DOS an überall funktionieren, ohne dass Erweiterungen erforderlich sind. Es wird davon ausgegangen, dass CODE sinnvoll oder gar nicht gesetzt ist.

Es führt zu einem Syntaxfehler, wenn CODE nicht vorhanden ist, oder zu nichts, wenn CODE ein Fragezeichen ist (ausgewählt, weil es in einem Pfad niemals vorhanden sein könnte). In jedem Fall wird nichts getan. Das NOT stellt sicher, dass nur dann Maßnahmen ergriffen werden, wenn CODE auf etwas Nützliches gesetzt zu sein scheint.

Ich verwende es in Compiler-Batchdateien, um zu bestimmen, ob relative Pfade oder ein festes Basisverzeichnis verwendet werden sollen, wenn eines in der CODE-Variablen festgelegt ist. Es ermöglicht mir, einen Codierungsbaum portabel zu machen, ohne alle Batch-Dateien für jedes Programm ändern zu müssen, wenn ich alles verschiebe.

1
Lostgallifreyan