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}?

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.


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
...

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%

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!


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.