Windows-Befehlszeile: Wie wird eine Variable in einer Schleife angehängt?

9

Ich versuche, eine Variable mit einer durch Leerzeichen getrennten Liste von Dateien zu füllen, aber ich kann mich nicht ganz darum kümmern.

Folgendes habe ich bisher:

set js_files=
for %%f in (js/*.js) do set js_files=%js_files% js/%%f
echo %js_files%
C:\path\to\jsminifier.exe --inputfiles %js_files%

Ich hätte erwartet, dass die js_filesVariable weiterhin an den nächsten Dateinamen angehängt wird, aber stattdessen wird die gesamte Variable ersetzt:

c:\dir>script.cmd
c:\dir>set js_files=
c:\dir>for %f in (js/*.js) do set js_files= js/%f
c:\dir>set js_files= js/one.js
c:\dir>set js_files= js/two.js
c:\dir>set js_files= js/three.js
c:\dir>echo  js/three.js
js/three.js

Ich sehe in der zweiten Ausgabezeile, dass die gesamte forZeile vor der Ausführung analysiert zu werden scheint, sodass der (anfängliche) leere Variablenwert für alle Iterationen verwendet wird.

Weiß jemand, wie man die Variable richtig anfügt?

Vielen Dank!

Alan
quelle

Antworten:

7

Versuchen Sie es so zu ändern:

set js_files=
for %%f in (js/*.js) do set js_files=!js_files! js/%%f
echo %js_files%
C:\path\to\jsminifier.exe --inputfiles %js_files%

Beachten Sie die Änderung von set js_files=%js_files% js/%%fto set js_files=!js_files! js/%%f- indem Sie die Ausrufezeichen anstelle von Prozentzeichen verwenden, weisen Sie die Shell an, die Umgebungsvariable während der Ausführung dynamisch zu erweitern.

Randolf Richardson
quelle
1
@Randolf - funktioniert nicht wirklich ... an welcher WindowsVersion funktioniert es für dich?
RonK
@ RonK: Ich habe diese Technik vor einigen Monaten unter Windows 7 (64-Bit-Edition) für ein anderes Projekt verwendet.
Randolf Richardson
@ RonK: Oh, ich sehe, was fehlt - Sie müssen Cmd zuerst mit dem Befehlszeilenschalter / V: ON starten. Sobald Sie dies getan haben und dann die Batch-Datei ausführen, funktioniert die Funktion "Verzögerte Umgebung".
Randolf Richardson
3
@ RonK: Anstatt den Schalter / V: ON zu verwenden, fügen Sie einfach diese Zeile (zwei Wörter) am Anfang Ihrer Batch-Datei ein (es wird viel einfacher): Setlocal EnableDelayedExpansion
Randolf Richardson
2
Das Hinzufügen setlocal EnableDelayedExpansionund Ändern von Ausrufezeichen hat funktioniert. Vielen Dank!
Alan