2017-05-02 2 views
1

Wenn ich versuche verzögerte Erweiterung einer Umgebungsvariablen mit einer Klausel innerhalb einer .BAT-Datei IF-Anweisung die Zeile fehlschlägt zu analysieren/ausführen. Verwenden von% -Zeichen anstelle von! für die Erweiterung funktioniert. Die identische verzögerte Erweiterung funktioniert auch an anderen Stellen, zB eine ECHO-Anweisung. Zum Beispiel:Bat-Datei enabledelayedexpansion wird in IF-Anweisung nicht erweitert

@echo off& setlocal enabledelayedexpansion 
set t=abcd 
echo !t:~0,2! 
if %t:~0,2% == ab echo equal 
if !t:~0,2! == ab echo equal 

Das Echo t: ~ 0,2! produziert richtig: ab

Die wenn% t: ~ 0,2% == ab Echo gleich erzeugt richtig: gleich

Die wenn t: ~ 0,2! == ab echo gleich gibt den Fehler aus: 2! war zu dieser Zeit unerwartet

Ich verstehe nicht, warum ich eine verzögerte Erweiterung mit einer Klausel innerhalb einer IF-Anweisung nicht verwenden kann. Ohne die colon-Klausel funktioniert die verzögerte Erweiterung innerhalb der IF-Anweisung einwandfrei.

Antwort

2

Das Problem ist nicht die verzögerte Erweiterung selbst, es ist das Komma innen.
Das liegt daran, dass der Batch-Parser den verzögerten Expansionsausdruck später als die prozentuale Expansion erweitert.
Daher der IF Parser sieht die !t:~0,2! und nimmt das Komma als Trennzeichen.

Sie können dies einfach mit Anführungszeichen vermeiden.
Oder das Komma zu entkommen.

if "!t:~0,2!" == "ab" echo equal 
if !t:~0^,2! == ab echo equal 

Sie können über die Reihenfolge der einzelnen Chargen Parser Phasen bei SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+0

es lesen Schätzen - das ist mein Problem gelöst, da ich mit Streichern in diesem Fall arbeitete. Es kann immer noch Probleme mit numerischen IF-Vergleichen geben, zB n = 123 setzen und wenn! N: ~ 1,2! gtr 5 - kann die Argumente nicht in Anführungszeichen einschließen, da dies einen Zeichenfolgenvergleich erzwingt. Wenn Sie zuvor ein Set verwenden und die verzögerte Erweiterung von der if-Anweisung entfernen, wird das behoben. –

+1

@PaulH Sie können das Komma auch mit einem Caret verlassen – jeb

Verwandte Themen