Windows batch-Programmierung: direkt - /Indirekt geschachtelte variable Auswertung
Haben wir eine text-Datei listet eine Reihe von Pfaden, und eine batch-Datei, liest die Zeilen aus dieser Datei.
Beispielsweise TargetFolders.txt möglicherweise enthalten die Zeile:
%ProgramFiles%\Acme\FooBar %VersionNumber%
Natürlich, wenn wir Lesen, diese Zeile aus der text-Datei (mit einer FOR-Befehl), wird die variable %%I wird die aktuelle Zeile text, mit dem % - Zeichen eher als das ersetzen der Variablen-Werte. So,
SET VersionNumber=7.0
FOR /F "eol=; delims=" %%I IN (TargetFolders.txt) DO (
echo Folder: %%I
)
Drucke
Folder: %ProgramFiles%\Acme\FooBar %VersionNumber%
Wie macht man es ersetzen die aktuellen Werte der Variablen, so dass es druckt
Folder: C:\Program Files\Acme\FooBar 7.0
?
- Wirkt wie ein Duplikat von Wie erweitern Sie eine CMD-shell-variable zweimal (rekursiv)
- Hmmm es ist nicht eine exakte Kopie, denn Sie haben die
%...%
im Ort, aber der link könnte hilfreich sein... - lrfy: Nicht genau; ich Rede nicht über mehrere Erweiterungen, nur, wie es den Verweis auf die variable in der ersten Linie, anstatt der %name%.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dort gehen Sie. (Dies ist, was du wolltest, richtig?)
=
bei der Definition delims für %%J-Schleife. Auch diese Lösung funktioniert nicht, wenn ein Ordner enthält eine nicht börsennotierte besonderen Charakter. Siehe meine Antwort. Ihre Nutzung der extra FÜR das mit ECHO ist besser als mein AUFRUF, weil es nicht zerfleischen zitiert caret"^"
^
in der Erwägung, dass CALL verstümmelt zitiert"^"
. 🙁Einfach das hinzufügen eines ANRUFS kann Ihr problem lösen. (auch Ihre definition von der Versionsnummer war falsch)
Aber dieser schlägt fehl, wenn die Datei enthält ohne Anführungszeichen Sonderzeichen wie
&
,>
,<
,|
.Beispielsweise die folgende Zeile würde fehlschlagen:
Es wird funktionieren, wenn es zitiert wird
Des ANRUFS wird auch die Fähigkeit 'zerfleischen' alle angegebenen carets:
"^"
wird"^^"
Die beste Lösung wäre, ändern Sie Ihre text-Datei und ersetzen Sie jedes
%
mit!
.Nun kann man sicher verwenden, verzögerte expansion zu erweitern, die Variablen innerhalb der Schleife.
Wenn Ihr text-Datei hat bereits
!
, die Sie erhalten wollen, dann muss es maskiert werden. Auch^
müssen escaped werden, wenn es scheint, auf einer Linie mit einer!
.Alternativ können Sie ersetzen Sie Variablen für die caret-und Ausrufezeichen Literale
Und dann definieren Sie die Variablen im batch -
Zur Ergänzung des bestehenden hilfreiche Antworten mit einem robustere Variante, dass auch behandelt die folgenden eingebetteten Zeichen korrekt:
& | < > ^
[1]:
Beachten Sie, dass für die Einfachheit ich bin mit einem string zu fahren, die äußeren Schleife, deren wörtliche Wert - erweitert werden, die später durch die innere Schleife ist
%ProgramFiles%\Acme\FooBar %VersionNumber%
aufgrund der doppelten%
Instanzen.Dadurch ergibt sich so etwas wie
Folder: [C:\Program Files\Acme\FooBar 0.7]
Hinweis:
for /f
interpretiert single-quoted string ('...'
) als einen Befehl auszuführen und dessen Ausgabe zu erfassen;delims=
sagtfor
zum erfassen der Ausgabe als ganzes in einer einzigen Variablen.(Während Sie kann Verwendung
usebackq
mit einem`...`
-geschlossenen-Befehl statt, es gibt keinen Vorteil zu tun, so in diesem Fall.)Beachten Sie, wie der Verweis auf die äußere Schleife die variable ist doppelten Anführungszeichen (
"%%f"
), das ist das, was der Wert zu enthalten, sagte Sonderzeichen, ohne dieecho
Befehl.Weil die Ausgabe werden dann auch die doppelten Anführungszeichen, die
~
operator wird verwendet, um Streifen die umschließenden doppelten Anführungszeichen aus dem aufgenommenen Wert auf hallte es (%%~g
).[1] Eine Lösung, die zusätzlich behandelt embedded
"
Instanzen ist schwieriger:Damit ergibt sich:
"[Windows_NT & %ba^r | (baz) <mo'>""]"