Come leggere il contenuto del file in una variabile in un file batch?


161

Questo file batch rilascia una build da TEST a LIVE. Voglio aggiungere un vincolo di controllo in questo file per garantire che sia presente un documento di rilascio accompagnatorio in una cartella specifica.

"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

Quindi ho un paio di domande su come raggiungere questo ...

  1. C'è un version.txtfile nella \\testserver\testapp$cartella e l'unico contenuto di questo file è il numero di build (ad esempio, 45 - per build 45) Come posso leggere il contenuto del version.txtfile in una variabile nel file batch?

  2. Come posso verificare se \\fileserver\myapp\releasedocs\ {build}.docesiste un file usando la variabile della parte 1 al posto di {build}?

Risposte:


300

Leggi il contenuto del file in una variabile:

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

o

set /p Build=<version.txt

Entrambi agiranno allo stesso modo con una sola riga nel file, per più righe la forvariante inserirà l' ultima riga nella variabile, mentre set /putilizzerà la prima.

L'uso della variabile, proprio come qualsiasi altra variabile d'ambiente, è una, dopo tutto:

%Build%

Quindi per verificare l'esistenza:

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

Anche se può darsi che non siano consentiti percorsi UNC. Non posso provarlo adesso, ma tienilo a mente.


4
Il setmetodo legge solo circa 1024 caratteri, perché?
Iulian Onofrei,

12
Probabilmente a causa dei limiti di un buffer all'interno cmd. È un linguaggio orribile per script affidabili.
Joey,

Lo so, ho lottato per ore per sostituire una stringa in un file: |
Iulian Onofrei,

16
@IulianOnofrei, set /pchiama cmd!ReadBufFromInputcon un buffer allocato in pila per leggere 1023 caratteri larghi (2046 byte). Legge 1023 byte dal file, assumendo 1 byte per carattere OEM / ANSI, ma decodifica il file utilizzando la tabella codici corrente, che non è necessariamente OEM / ANSI. Il caso peggiore è la tabella codici 65001 e un file riempito con caratteri UTF-8 a 4 byte (ad esempio uno script antico). Otterrai 255 caratteri, oltre a un carattere parzialmente decodificato memorizzato come carattere sostitutivo, U + FFFD.
Eryk Sun

3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help formenziona questo, a proposito.
Joey,

46

Puoi leggere più variabili da un file come questo:

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

dove param.txt:

PARAM1=value1
PARAM2=value2
...

1
questa è la soluzione perfetta. per rispondere letteralmente al PO, (param.txt)dovrebbe essere (version.txt)e dovrebbe contenereBuild=45
robotik,

Questa è la soluzione
JAIL

3
%% G era imprevisto in questo momento.
Giovanni,

4
@Giovanni: per usarlo direttamente dalla riga di comando, sostituisci ogni %%Gcon%G
Stephan

32

basta fare:

type version.txt

e verrà visualizzato come se si digitasse:

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

4
@jeb lo so, ma sono ancora grato per il comando type perché è quello di cui avevo bisogno
MSM,

Grazie per aver fornito la versione del tipo. Funziona esattamente per quello che mi serve, accedendo al contenuto del file che si trova in una directory condivisa.
Tastybrownies,

22

Per ottenere tutte le righe del file caricate nella variabile, è necessaria l'espansione ritardata, quindi procedi come segue:

SETLOCAL EnableDelayedExpansion

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

C'è un problema con alcuni personaggi speciali, anche se in particolare ;, %e!


Racchiudere l'intera setespressione all'interno virgolette potrebbe evitare problemi con almeno alcuni caratteri speciali: set "Build=!Build!%%x".
aschipfl,

9
La mia sceneggiatura stampa semplicemente "echo is ON". Perché la spazzatura completa in batch?
Trevor Hickey,

Funziona per me senza espansione ritardata: set err=(riga successiva)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

2
Perché la spazzatura completa in batch? ... per coerenza?
Jan Nielsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.