Comment lire le contenu d'un fichier dans une variable dans un fichier batch?

161

Ce fichier de commandes libère une version de TEST à LIVE. Je souhaite ajouter une contrainte de vérification dans ce fichier qui garantit qu'il existe un document de publication d'accompagnement dans un dossier spécifique.

"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

J'ai donc quelques questions sur la façon d'y parvenir ...

  1. Il y a un version.txtfichier dans le \\testserver\testapp$dossier, et le seul contenu de ce fichier est le numéro de build (par exemple, 45 - pour la build 45) Comment lire le contenu du version.txtfichier dans une variable du fichier de commandes?

  2. Comment vérifier si un fichier \\fileserver\myapp\releasedocs\ {build}.doc,, existe en utilisant la variable de la partie 1 à la place de {build}?

user23048345
la source

Réponses:

300

Lisez le contenu du fichier dans une variable:

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

ou

set /p Build=<version.txt

Les deux agiront de la même manière avec une seule ligne dans le fichier, pour plus de lignes, la forvariante mettra la dernière ligne dans la variable, tandis set /pqu'elle utilisera la première.

En utilisant la variable - comme toute autre variable d'environnement - c'est une, après tout:

%Build%

Donc pour vérifier l'existence:

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

Même s'il se peut qu'aucun chemin UNC n'y soit autorisé. Je ne peux pas tester cela pour le moment, mais gardez cela à l'esprit.

Joey
la source
4
La setméthode ne lit qu'environ 1024 caractères, pourquoi?
Iulian Onofrei
12
Probablement en raison des limites d'un tampon à l'intérieur cmd. C'est un langage horrible pour des scripts fiables.
Joey
Je sais, j'ai eu du mal pendant des heures à remplacer une chaîne dans un fichier: |
Iulian Onofrei
16
@IulianOnofrei, set /pappelle cmd!ReadBufFromInputavec un tampon alloué par pile pour lire 1023 caractères larges (2046 octets). Il lit 1023 octets du fichier, en supposant 1 octet par caractère OEM / ANSI, mais il décode le fichier en utilisant la page de codes actuelle, qui n'est pas nécessairement OEM / ANSI. Le pire des cas est la page de codes 65001 et un fichier rempli de caractères UTF-8 de 4 octets (par exemple un ancien script). Vous obtiendrez 255 caractères, plus un caractère partiellement décodé stocké comme caractère de remplacement, U + FFFD.
Eryk Sun
3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help forle mentionne d'ailleurs.
Joey
46

Vous pouvez lire plusieurs variables à partir d'un fichier comme celui-ci:

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

où param.txt:

PARAM1=value1
PARAM2=value2
...
xnagyg
la source
1
C'est la solution parfaite. pour répondre littéralement à l'OP, (param.txt)devrait être (version.txt)et il devrait contenirBuild=45
robotik
Voilà la solution.
JAIL
3
%% G était inattendu à ce moment.
John
4
@John: pour une utilisation directement sur la ligne de commande, remplacez chaque %%Gpar%G
Stephan
32

fais juste:

type version.txt

et il s'affichera comme si vous aviez tapé:

set /p Build=<version.txt
echo %Build%
psrcek
la source
4
@jeb je le sais mais je suis toujours reconnaissant pour la commande de type parce que c'est ce dont j'avais besoin
MSM
Merci d'avoir fourni la version type. Fonctionne exactement pour ce dont j'ai besoin, en accédant au contenu des fichiers qui se trouvent dans un répertoire partagé.
Tastybrownies
22

Pour que toutes les lignes du fichier soient chargées dans la variable, l'expansion retardée est nécessaire, procédez comme suit:

SETLOCAL EnableDelayedExpansion

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

Il y a un problème avec certains caractères spéciaux, mais surtout ;, %et!

DPS
la source
Mettre toute l' setexpression entre guillemets peut éviter des problèmes avec au moins certains caractères spéciaux:set "Build=!Build!%%x" .
aschipfl
9
Mon script affiche juste "l'écho est activé". Pourquoi les ordures par lots sont-elles complètes?
Trevor Hickey
Fonctionne pour moi sans extension retardée: set err=(ligne suivante)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
Tivnet
2
Pourquoi les ordures par lots sont-elles complètes? ...pour la cohérence?
Jan Nielsen