我需要能够加载文本文件的全部内容并将其加载到变量中以便进一步处理。
我该怎么做?
感谢Roman Odaisky的回答,这就是我所做的。
SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i
echo %content%
EndLocal
答案 0 :(得分:50)
如果您的set命令支持/ p开关,那么您可以通过这种方式管道输入。
set /p VAR1=<test.txt
/ P开关允许您将变量的值设置为一行 用户输入的输入。之前显示指定的promptString 阅读输入线。 promptString可以为空。
这为使用未注册的文件类型(接受的答案没有)提供了额外的好处。
答案 1 :(得分:14)
使用for
,类似于:
set content=
for /f "delims=" %%i in ('filename') do set content=%content% %%i
也许您必须setlocal enabledelayedexpansion
和/或使用!content!
而不是%content%
。我无法测试,因为我附近没有任何MS Windows(我希望你也一样: - )。
我所知道的最好的批处理文件 - 黑魔法参考是http://www.rsdn.ru/article/winshell/batanyca.xml。如果你不懂俄语,你仍然可以使用提供的代码片段。
答案 2 :(得分:2)
你能定义进一步的处理吗?
你可以使用for循环来实现这一点,但是没有简单的方法将CR / LF插入到环境变量中,所以你将把所有东西都放在一行中。 (你可以根据自己的需要来解决这个问题。)
这种方式也限制在不到8k左右的文本文件中。 (你不能创建一个大于8k的单个env var。)
比尔建议的for循环可能就是你所需要的。您一次处理一行文件:(在批处理文件中的命令行%i
处使用%%i
)
for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i
更高级:
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
答案 3 :(得分:2)
您可以使用:
set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
答案 4 :(得分:1)
要读入整个多行文件但保留换行符,您必须重新插入它们。以下(将“<...>”替换为我的文件路径)可以解决问题:
@echo OFF
SETLOCAL EnableDelayedExpansion
set N=^
REM These two empty lines are required
set CONTENT=
set FILE=<...>
for /f "delims=" %%x in ('type %FILE%') do set "CONTENT=!CONTENT!%%x!N!"
echo !CONTENT!
ENDLOCAL
您可能想做其他事情而不是回显文件内容。
请注意,可以通过这种方式读取的数据量可能存在限制,因此您的里程可能会有所不同。
答案 5 :(得分:0)
创建一个名为“SetFile.bat”的文件,其中包含以下行,其末尾带有无回车 ...
set FileContents=
然后在批处理文件中执行类似的操作......
@echo off
copy SetFile.bat + %1 $tmp$.bat > nul
call $tmp$.bat
del $tmp$.bat
%1是输入文件的名称,%FileContents%将包含调用后输入文件的内容。这只适用于单行文件(即不包含回车符的文件)。如果需要,可以在调用%tmp%.bat之前从文件中删除/替换回车符。
答案 6 :(得分:-1)
for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause