Vraag Hoe kan ik de inhoud van een tekstbestand in een batchbestand variabele laden?


Ik moet de volledige inhoud van een tekstbestand kunnen laden en in een variabele kunnen laden voor verdere verwerking.

Hoe kan ik dat doen?


Dit is wat ik gedaan heb dankzij het antwoord van Roman Odaisky.

SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i

echo %content%
EndLocal

31
2017-09-25 15:29


oorsprong


antwoorden:


Gebruik for, iets in de trant van:

set content=
for /f "delims=" %%i in ('filename') do set content=%content% %%i

Misschien moet je het doen setlocal enabledelayedexpansion en / of gebruik !content! liever dan %content%. Ik kan niet testen, omdat ik geen MS Windows in de buurt heb (en ik wens je hetzelfde :-).

De beste batch-bestand-zwart-magische referentie waar ik weet van is http://www.rsdn.ru/article/winshell/batanyca.xml. Als u Russisch niet kent, kunt u nog steeds gebruik maken van de verstrekte codefragmenten.


14
2017-09-25 15:49



Als uw ingestelde opdracht de schakeloptie / p ondersteunt, kunt u de invoer op die manier invoeren.

set /p VAR1=<test.txt

set /? | vind "/ P"

Met de schakeloptie / P kunt u de waarde van een variabele instellen op een regel van   invoer ingevoerd door de gebruiker. Geeft eerder de opgegeven promptString weer   de invoerregel lezen. De promptString kan leeg zijn.

Dit heeft het extra voordeel dat u werkt voor niet-geregistreerde bestandstypen (wat het geaccepteerde antwoord niet is).


50
2018-01-31 20:30



Je kunt gebruiken:

set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i

2
2017-09-25 16:23



Kun je verdere verwerking definiëren?

Je kunt een for-lus bijna gebruiken, maar er is geen eenvoudige manier om CR / LF in een omgevingsvariabele in te voegen, dus je hebt alles op één regel. (u kunt dit mogelijk omzeilen, afhankelijk van wat u moet doen.)

Je bent op deze manier ook beperkt tot minder dan ongeveer 8k tekstbestanden. (U kunt niet één env var groter dan ongeveer 8k maken.)

Bill's suggestie van een for-lus is waarschijnlijk wat je nodig hebt. U verwerkt het bestand één regel tegelijk:

(gebruik %i op een opdrachtregel %%i in een batchbestand)

for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i

meer geavanceerd:

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

1
2017-09-25 16:14



Maak een bestand met de naam "SetFile.bat" met de volgende regel geen rijterugkeer aan het einde ervan ...

set FileContents=

Doe dan in je batchbestand zoiets als ...

   @echo off
   copy SetFile.bat + %1 $tmp$.bat > nul
   call $tmp$.bat
   del $tmp$.bat

% 1 is de naam van uw invoerbestand en% FileContents% bevat de inhoud van het invoerbestand na het gesprek. Dit werkt echter alleen op een bestand met één regel (dat wil zeggen een bestand dat geen regelterugloop bevat). U kunt de carriage-returns uit het bestand verwijderen / vervangen voordat u% tmp% .bat naar zo nodig belt.


0
2017-09-25 15:58



for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause

-1
2017-08-04 15:30