J'ai besoin de pouvoir charger tout le contenu d'un fichier texte et le charger dans une variable pour un traitement ultérieur.
Comment puis je faire ça?
Voici ce que j'ai fait grâce à la réponse de Roman Odaisky.
SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i
echo %content%
EndLocal
Utilisez for
, quelque chose comme:
set content=
for /f "delims=" %%i in ('filename') do set content=%content% %%i
Vous devrez peut-être faire setlocal enabledelayedexpansion
et/ou utilisez !content!
plutôt que %content%
. Je ne peux pas tester, car je n'ai pas de MS Windows à proximité (et je vous souhaite la même chose :-).
La meilleure référence de fichier batch-black-magic que je connaisse est à http://www.rsdn.ru/article/winshell/batanyca.xml . Si vous ne connaissez pas le russe, vous pouvez toujours utiliser les extraits de code fournis.
Si votre commande set
prend en charge le /p
switch, vous pouvez alors diriger l'entrée de cette façon.
set /p VAR1=<test.txt
set /? |find "/P"
Le commutateur/P vous permet de définir la valeur d'une variable sur une ligne d'entrée entrée par l'utilisateur. Affiche la chaîne d'invite spécifiée avant de lire la ligne d'entrée. L'inviteString peut être vide.
Cela a l'avantage supplémentaire de fonctionner pour les types de fichiers non enregistrés (ce que la réponse acceptée ne fait pas).
Pouvez-vous définir un traitement ultérieur?
Vous pouvez utiliser une boucle for pour presque faire cela, mais il n'y a pas de moyen facile d'insérer CR/LF dans une variable d'environnement, donc vous aurez tout sur une seule ligne. (vous pourrez peut-être contourner ce problème en fonction de ce que vous devez faire.)
Vous êtes également limité à moins d'environ 8 000 fichiers texte de cette façon. (Vous ne pouvez pas créer une seule variable env supérieure à environ 8k.)
La suggestion de Bill d'une boucle for est probablement ce dont vous avez besoin. Vous traitez le fichier une ligne à la fois:
(utilisation %i
sur une ligne de commande %%i
dans un fichier batch)
for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i
plus avancé:
for /f "tokens=1 delims=" %%i in (file.txt) do call :part2 %%i
goto :fin
:part2
echo %1
::do further processing here
goto :eof
:fin
Vous pouvez utiliser:
set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
Créez un fichier appelé "SetFile.bat" qui contient la ligne suivante avec pas de retour chariot à la fin de celui-ci ...
set FileContents=
Ensuite, dans votre fichier batch, faites quelque chose comme ça ...
@echo off
copy SetFile.bat + %1 $tmp$.bat > nul
call $tmp$.bat
del $tmp$.bat
% 1 est le nom de votre fichier d'entrée et% FileContents% contiendra le contenu du fichier d'entrée après l'appel. Cela ne fonctionnera cependant que sur un fichier d'une ligne (c'est-à-dire un fichier ne contenant aucun retour chariot). Vous pouvez supprimer/remplacer les retours chariot du fichier avant d'appeler le% tmp% .bat si nécessaire.
for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause