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.