Wie lese ich Dateiinhalte in eine Variable in einer Batchdatei?

161

Diese Batch-Datei gibt einen Build von TEST nach LIVE frei. Ich möchte dieser Datei eine Prüfbeschränkung hinzufügen, die sicherstellt, dass sich in einem bestimmten Ordner ein zugehöriges Release-Dokument befindet.

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

Ich habe also ein paar Fragen, wie ich das erreichen kann ...

  1. version.txtDer \\testserver\testapp$Ordner enthält eine Datei , und der einzige Inhalt dieser Datei ist die Build-Nummer (z. B. 45 - für Build 45). Wie lese ich den Inhalt der version.txtDatei in eine Variable in der Batch-Datei?

  2. Wie überprüfe ich, ob eine Datei vorhanden ist \\fileserver\myapp\releasedocs\ {build}.doc, indem ich die Variable aus Teil 1 anstelle von {build} verwende?

user23048345
quelle

Antworten:

300

Lesen Sie den Dateiinhalt in eine Variable:

for /f "delims=" %%x in (version.txt) do set Build=%%x

oder

set /p Build=<version.txt

Beide verhalten sich mit nur einer einzigen Zeile in der Datei gleich. Bei mehr Zeilen fügt die forVariante die letzte Zeile in die Variable ein, während set /pdie erste verwendet wird.

Wenn Sie die Variable verwenden - genau wie jede andere Umgebungsvariable - ist es schließlich eine:

%Build%

Also auf Existenz prüfen:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

Obwohl es durchaus sein kann, dass dort keine UNC-Pfade erlaubt sind. Ich kann das momentan nicht testen, aber denke daran.

Joey
quelle
4
Die setMethode liest nur ungefähr 1024 Zeichen, warum ist das so?
Iulian Onofrei
12
Wahrscheinlich aufgrund der Grenzen eines Puffers innerhalb cmd. Es ist eine schreckliche Sprache für zuverlässige Skripte.
Joey
Ich weiß, ich hatte stundenlang Mühe, eine Zeichenfolge in einer Datei zu ersetzen: |
Iulian Onofrei
16
@IulianOnofrei, set /p ruft cmd!ReadBufFromInputmit einem dem Stapel zugewiesenen Puffer auf, um 1023 breite Zeichen (2046 Bytes) zu lesen. Es liest 1023 Bytes aus der Datei, wobei 1 Byte pro OEM / ANSI-Zeichen angenommen wird, dekodiert die Datei jedoch mit der aktuellen Codepage, die nicht unbedingt OEM / ANSI ist. Der schlimmste Fall ist die Codepage 65001 und eine Datei mit 4-Byte-UTF-8-Zeichen (z. B. ein altes Skript). Sie erhalten 255 Zeichen sowie ein teilweise dekodiertes Zeichen, das als Ersatzzeichen U + FFFD gespeichert ist.
Eryk Sun
3
@ Jan : for /f "usebackq" %%x in ("path with spaces.txt") .... help forerwähnt dies übrigens.
Joey
46

Sie können mehrere Variablen wie folgt aus einer Datei lesen:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

wo param.txt:

PARAM1=value1
PARAM2=value2
...
xnagyg
quelle
1
Das ist die perfekte Lösung. buchstäblich auf das OP zu antworten, (param.txt)sollte sein (version.txt)und es sollte enthaltenBuild=45
robotik
Das ist die Lösung.
Gefängnis
3
%% G war zu diesem Zeitpunkt unerwartet.
John
4
@ John: Für die Verwendung direkt in der Kommandozeile ersetzen Sie alle %%Gdurch%G
Stephan
32

mach einfach:

type version.txt

und es wird angezeigt, als ob Sie Folgendes eingegeben haben:

set /p Build=<version.txt
echo %Build%
psrcek
quelle
4
@Jeb Ich weiß das, aber ich bin immer noch dankbar für den Typ Befehl, weil das ist, was ich brauchte
MSM
Vielen Dank für die Bereitstellung der Typversion. Funktioniert genau für das, was ich brauche, und greift auf Dateiinhalte zu, die sich in einem freigegebenen Verzeichnis befinden.
Tastybrownies
22

Um alle Zeilen der Datei in die Variable zu laden, ist eine verzögerte Erweiterung erforderlich. Gehen Sie wie folgt vor:

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

Es gibt ein Problem mit einigen Sonderzeichen, wenn auch vor allem ;, %und!

DPS
quelle
Wenn Sie den gesamten setAusdruck in doppelte Anführungszeichen setzen, können Probleme mit mindestens einigen Sonderzeichen vermieden werden : set "Build=!Build!%%x".
aschipfl
9
Mein Skript gibt nur "Echo ist EIN" aus. Warum ist Batch kompletter Müll?
Trevor Hickey
Funktioniert für mich ohne verzögerte Erweiterung: set err=(nächste Zeile)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet
1
Warum ist Batch kompletter Müll? ... für Konsistenz?
Jan Nielsen