Windows XP Batch-Datei concat
-
19-09-2019 - |
Frage
Ich versuche, die folgende lächerliche Aufgabe zu erfüllen:
Ich habe eine Textdatei mit einer Reihe von vollständig qualifizierten filesnames enthält. Ich möchte durch die Datei zu durchlaufen und jede Zeile mit einer gemeinsamen Variable anzuhängen, die zu einem Kommandozeilen-Tool übergeben werden kann. Zum Beispiel könnte die Datei sein:
C: \ dir \ test.txt
C: \ WINDOWS \ test2.txt
C: \ text3.txt
und ich möchte sie zu einem gewissen Variablen zugewiesen werden ‚a‘, so dass:
a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"
Eine zweite Frage ist - was ist eine gute Batch-Datei Referenz? Ich bin ein paar Sachen in dem Windows-Material zu finden, und eine Menge von home-grown-Websites, aber nichts besonders abgeschlossen.
Lösung
Wie für Referenzen, SS64.com ist nicht schlecht. Rob van der Woude ziemlich oft verknüpft wird, auch.
Wie für Ihr Problem, das ist einfach:
@echo off
setlocal enableextensions enabledelayedexpansion
set LIST=
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
echo %LIST%
endlocal
Weitere in ausführliche Erläuterung:
setlocal enableextensions enabledelayedexpansion
Wir ermöglichen verzögerte Erweiterung hier. Dies ist entscheidend, da sonst wären wir nicht in der Lage sein, die Liste der Dateien im for
Schleife zu manipulieren, die folgen.
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
for /f
iteriert über Zeilen in einer Datei, so genau das, was wir brauchen hier. In jeder Schleife Iteration anhängen wir die nächste Zeile zu der LIST
Variable. Beachten Sie die Verwendung von !LIST!
statt der üblichen %LIST%
. Dies signalisiert verzögerte Expansion und stellt sicher, dass die Variable wird jedes Mal dieser Befehl ausgeführt wird, neu bewertet.
In der Regel cmd
erweitert Variablen auf ihre Werte, sobald eine Zeile gelesen wird und analysiert wird. Für cmd
eine einzelne Zeile ist entweder eine Linie oder alles, was zählt als eine Linie, die für die Blöcke begrenzt durch Klammern, wie wir sie hier verwendet, um wahr zu halten geschieht. Also für cmd
der gesamte Block ist eine einzige Aussage, die gelesen wird und einmal analysiert, und zwar unabhängig davon, wie oft das Innere der Schleife ausgeführt wird.
Wenn wir %LIST%
hier statt !LIST!
verwendet hätten, dann würde die Variable sofort durch seinen Wert (leer an diesem Punkt) ersetzt worden ist, und die Schleife würde so ausgesehen hat:
for /f %%x in (yourfile.txt) do (
set LIST= "%%x"
)
Dies ist eindeutig nicht das, was wir wollten. Verzögerte Erweiterung sorgt dafür, dass eine Variable nur erweitert wird, wenn sein Wert wird wirklich benötigt wird. In diesem Fall, wenn das Innere der Schleife läuft und eine Liste von Dateinamen konstruiert.
Danach wird die Variable %LIST%
oder !LIST!
(jetzt ist es nicht wirklich wichtig, mehr, welche zu verwenden) die Liste der Zeilen aus der Datei enthält.
Komischerweise enthält die Hilfe für den Befehl set
genau dieses Beispiel für die verzögerte Expansion:
Schließlich Unterstützung für verzögert Erweiterung von Umgebungsvariablen hat hinzugefügt. Diese Unterstützung ist immer standardmäßig deaktiviert, kann aber sein, aktiviert / über den / V-Befehl Behinderte Leitungsschalter nach CMD.EXE. Siehe CMD /?
Verzögerte Erweiterung von Umgebungsvariablen ist nützlich, um rund um die Einschränkungen der aktuellen Expansion die geschieht, wenn eine Textzeile ist, lesen, nicht, wenn sie ausgeführt wird. Das folgende Beispiel zeigt die Problem mit sofortigem Variable Expansion:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "%VAR%" == "after" @echo If you see this, it worked )
würde nie die Nachricht anzuzeigen, da das% VAR% in IF-Anweisungen BEIDE ist wenn der erste substituierte IF Anweisung gelesen wird, da es logisch weist der Körper des IF, das ist eine zusammengesetzte Anweisung. So ist die IF innerhalb der zusammengesetzten Anweisung ist wirklich zu vergleichen „vor“ mit „nach“ die nie gleich sein. Ähnlich, Im folgenden Beispiel wird nicht funktionieren wie erwartet:
set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST%
, dass es baut keine Liste Dateien im aktuellen Verzeichnis, aber stattdessen setzen nur die LIST Variable in die letzte Datei gefunden. Auch dies ist, weil die% LIST% ist erweitert nur einmal, wenn die FOR Anweisung gelesen wird, und zu diesem Zeitpunkt die LIST Variable ist leer. so ist die Ist FOR-Schleife ist, die wir ausführen:
for %i in (*) do set LIST= %i
, die nur Liste Einstellung auf das hält letzte Datei gefunden.
Verzögerte Erweiterung von Umgebungsvariablen Damit können Sie ein anderes verwenden, Zeichen (das Ausrufezeichen) an erweitern Umgebungsvariablen an Ausführungszeit. Wenn verzögerte Variable Expansion ermöglicht wird, die oberhalb Beispiele geschrieben werden könnte wie folgt zu arbeiten, wie beabsichtigt:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo If you see this, it worked ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%
Andere Tipps
Was Sie nach mit einem FÜR / F-Befehl durchgeführt werden.
Hier ist eine gute Ressource, die ich viele Male verwendet haben:
Ein gutes Buch: Windows NT Shell Scripting von Tim Hill. Die Ausgabe I wurde 1998 veröffentlicht, aber es ist für Windows-Befehl Programme in Windows 2008 noch gültig ist.
type *commonfilepart* >> concat_result_file
OS: Windows Server 2003