216 votes

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

Ce fichier batch libère un build de TEST à LIVE. Je veux ajouter une contrainte de contrôle dans ce fichier pour m'assurer qu'il y a un document de version conforme 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 existe un version.txt dans le fichier \\testserver\testapp$ et le seul contenu de ce fichier est le numéro de construction (par exemple, 45 - pour la construction 45). Comment puis-je lire le contenu du fichier version.txt dans une variable du fichier batch ?

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

399voto

Joey Points 148544

Lire le contenu du fichier dans une variable :

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

o

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 fonction for mettra la dernier dans la variable, tandis que set /p utilisera le d'abord.

Utilisation de la variable - comme toute autre variable d'environnement - c'en est une, après tout :

%Build%

Donc pour vérifier l'existence :

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

Bien qu'il soit possible qu'aucun chemin UNC ne soit autorisé à cet endroit. Je ne peux pas le tester pour le moment mais gardez cela à l'esprit.

9 votes

El set ne lit qu'environ 1024 caractères, pourquoi ?

15 votes

Probablement en raison des limites d'un tampon dans cmd . C'est un langage horrible pour des scripts fiables.

1 votes

Je sais, j'ai lutté pendant des heures pour remplacer une chaîne de caractères dans un fichier :|.

71voto

xnagyg Points 346

Vous pouvez lire plusieurs variables à partir d'un fichier comme ceci :

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

où param.txt :

PARAM1=value1
PARAM2=value2
...

3 votes

C'est la solution parfaite. Pour répondre littéralement à l'OP, (param.txt) devrait être (version.txt) et il devrait contenir Build=45

0 votes

C'est le site solution.

3 votes

%%G était inattendu à ce moment-là.

44voto

David Points 28

Faites-le :

type version.txt

et il sera affiché comme si vous aviez tapé :

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

4 votes

@jeb je le sais mais je suis quand même reconnaissant pour la commande type car c'est ce dont j'avais besoin

0 votes

Merci d'avoir fourni la version type. Elle fonctionne exactement pour ce dont j'ai besoin, à savoir accéder au contenu de fichiers qui se trouvent dans un répertoire partagé.

29voto

DPS Points 31

Pour que toutes les lignes du fichier soient chargées dans la variable, l'expansion retardée est nécessaire, alors faites ce qui suit :

SETLOCAL EnableDelayedExpansion

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

Il y a cependant un problème avec certains caractères spéciaux, notamment ; , % y !

2 votes

Enfermer l'ensemble du set entre guillemets pourrait éviter des problèmes avec au moins un peu de les caractères spéciaux : set "Build=!Build!%%x" .

11 votes

Mon script imprime juste "echo is ON". Pourquoi le lot est-il un déchet complet ?

0 votes

Ça marche pour moi sans l'expansion retardée : set err= (ligne suivante) for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X