Verwenden von Call SET zum Festlegen einer Variablen in einer Dos-Batch-For-Schleife

10335
Ray G

Versuch, das Call SET zu verwenden, um eine Variable in einer Windows-Batch-Dateischleife festzulegen. Funktioniert nicht, aber hier ist die Eingabe- / Ausgabedatei. versuchen, Var C gleich 1 zuzuweisen.

Batchdatei:

 @ECHO OFF for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (  echo Hello No Hockey>%%a.txt  echo #:A %%a>>%%a.txt  echo #:B %%b>>%%a.txt  if /I %%c gtr 10 call set %%c==1  echo #:C %%c>>%%a.txt  ) 

Puck.csv

1991,NHL Strike,20  1992,NHL Strike,20  1993,NHL Strike,20 

Ausgabe:

Hello No Hockey #:A 1991 #:B NHL Strike #:C 20 Hello No Hockey #:A 1992 #:B NHL Strike #:C 20 Hello No Hockey #:A 1993 #:B NHL Strike #:C 20 

0

2 Antworten auf die Frage

2
dbenham

Sie haben 2 Probleme:

1) Sie verwechseln FOR-Variablen mit Umgebungsvariablen. Eine Charge für Variablenname ist immer ein einzelnes Zeichen, und es ist der Zugang über 2 Prozent vor dem Namen: %%c. Ein FOR-Variablenwert kann nicht mit SET geändert werden.

Eine Umgebungsvariable Name kann mehrere Zeichen enthalten, obwohl es ein einzelnes Zeichen sein kann, und es wird durch Einschließen des Namens in Prozenten zugegriffen: %var%. Ausrufungszeichen verwendet werden, wenn Sie verzögerten Expansion wollen: !var!. Ein Umgebungsvariablenwert wird mit SET eingestellt.

2) Der CALL-Trick, um auf Umgebungsvariablenwerte zuzugreifen, die in einem geklammerten Codeblock festgelegt wurden, wird zur Erweiterungszeit verwendet, nicht wenn Sie den Wert festlegen.

Ich glaube, dass Mousio die beste Antwort geliefert hat. Ich verwende immer eine verzögerte Erweiterung wie in dieser Antwort. Sie können jedoch ohne Verzögerung eine Erweiterung ausführen, indem Sie eine Umgebungsvariable und den CALL-Trick verwenden.

@echo off for /f "tokens=1-3 delims=," %%a in (Puck.csv) do ( echo Hello No Hockey>%%a.txt echo #:A %%a>>%%a.txt echo #:B %%b>>%%a.txt set C=%%c if /i %%c gtr 10 set C=1 call echo #:C %%C%%>>%%a.txt ) 

Beachten Sie, dass es entscheidend ist, dass sich die FOR-Variable von der Umgebungsvariablen unterscheidet. FOR-Variablen unterscheiden zwischen Groß- und Kleinschreibung, Umgebungsvariablen nicht. Wenn Sie cfür beide verwenden, wird der Parser %%c%%als FOR-Variable behandelt, gefolgt von einem Prozentwert - und nicht dem, was Sie möchten.

1
mousio
 @ECHO OFF setlocal enabledelayedexpansion for /f "tokens=1-3 delims=," %%a in (Puck.csv) do ( echo Hello No Hockey>%%a.txt echo #:A %%a>>%%a.txt echo #:B %%b>>%%a.txt set c=%%c if /I !c! gtr 10 set c=1 echo #:C !c!>>%%a.txt ) 

Suchen Sie einfach nach enabledelayedexpansionund erfahren Sie, wann und wie (mit !statt %). Beim Zurücksetzen von c (mit einem einzigen )
ist keine Verwendung erforderlich .call=