2010-06-18 7 views
97

Diese Batchdatei gibt einen Build von TEST zu LIVE frei. Ich möchte in dieser Datei eine Prüfbedingung hinzufügen, die sicherstellt, dass ein bestimmtes Freigabedokument in einem bestimmten Ordner vorhanden ist.Wie lese ich Dateiinhalte in eine Variable in einer Batch-Datei?

"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 

So habe ich ein paar Fragen darüber, wie dieses Ziel zu erreichen ...

  1. Es gibt eine version.txt-Datei in dem Ordner \\testserver\testapp$, und der einzige Inhalt dieser Datei ist die Build-Nummer (zum Beispiel 45 - für Build 45) Wie lese ich den Inhalt der version.txt Datei in eine Variable in der Batch-Datei?

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

Antwort

198

lesen Dateiinhalt in eine Variable:

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

oder

set /p Build=<version.txt 

Beide werden das gleiche mit nur einer einzigen Zeile in der Datei handeln, um weitere Linien die for Variante wird Setzen Sie die letzte Zeile in die Variable, während set /p die zuerst verwenden wird.

Mit der Variable - wie jede andere Umgebungsvariable - es ist man schließlich:

%Build% 

So Existenz zu überprüfen:

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

Obwohl es gut, dass nicht sein kann, UNC-Pfade sind dort erlaubt. Kann das jetzt nicht testen, aber bedenke das.

+0

Die 'Set' Methode nur etwa 1024 Zeichen liest, warum ist das? –

+8

Wahrscheinlich aufgrund von Grenzen eines Puffers innerhalb von 'cmd'. Es ist eine schreckliche Sprache für zuverlässige Skripte. – Joey

+0

Ich weiß, ich habe stundenlang gekämpft, um eine Zeichenfolge in einer Datei zu ersetzen: | –

12

Um alle Zeilen der in die Variable geladen Datei zu erhalten, verzögert Expansion benötigt wird, so 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, obwohl besonders ;, % und !

+0

Das Umschließen des gesamten Set-Ausdrucks in Anführungszeichen könnte Probleme mit mindestens _einigen Sonderzeichen vermeiden: 'set" Build =! Build! %% x "'. – aschipfl

+5

Mein Skript druckt nur "Echo ist eingeschaltet". Warum ist Batch-Müll abgeschlossen? –

23

gerade tun:

type version.txt 

und es wird angezeigt, als ob Sie eingegeben haben:

set /p Build=<version.txt 
echo %Build% 
+1

-1 Das gleiche wird von Joey vor 3 Jahren beantwortet. Aber er liefert mehr Infos – jeb

+4

@jeb ich weiß das, aber ich bin immer noch dankbar für die Art Befehl, denn das ist, was ich brauchte –

26

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

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

wo PARAM.TXT:

PARAM1=value1 
PARAM2=value2 
... 
+0

das ist die perfekte Lösung. um das OP buchstäblich zu beantworten, '(param.txt)' sollte '(version.txt)' sein und es sollte 'Build = 45' enthalten – robotik

+0

Dies ist ** die ** Lösung. –

+1

%% G war zu dieser Zeit unerwartet. – John

-2
@echo off 
set str=^&Type file.txt 
echo %str% 
+0

Dies ist falsch, da str nicht die Ausgabe des Befehls type enthält. Stattdessen enthält es einfach den Befehl mit einem führenden kaufmännischen Und-Zeichen – jeb

Verwandte Themen