我需要能够加载文本文件的全部内容并将其加载到变量中以进行进一步处理。
我怎样才能做到这一点?
感谢 Roman Odaisky 的回答,这就是我所做的。
SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i
echo %content%
EndLocal
我需要能够加载文本文件的全部内容并将其加载到变量中以进行进一步处理。
我怎样才能做到这一点?
感谢 Roman Odaisky 的回答,这就是我所做的。
SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i
echo %content%
EndLocal
如果您的set
命令支持/p
开关,那么您可以通过这种方式管道输入。
set /p VAR1=<test.txt
set /? |find "/P"
/P 开关允许您将变量的值设置为用户输入的一行输入。在读取输入行之前显示指定的 promptString。promptString 可以为空。
这具有为未注册的文件类型工作的额外好处(接受的答案没有)。
使用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。如果您不懂俄语,您仍然可以使用提供的代码片段。
你能定义进一步的处理吗?
您几乎可以使用 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
您可以使用:
set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
要读入整个多行文件但保留换行符,您必须重新插入它们。以下(将“<...>”替换为我的文件的路径)起到了作用:
@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
您可能想做其他事情而不是回显文件内容。
请注意,以这种方式可以读取的数据量可能会受到限制,因此您的里程可能会有所不同。
创建一个名为“SetFile.bat”的文件,其中包含以下行,末尾没有回车...
set FileContents=
然后在你的批处理文件中做这样的事情......
@echo off
copy SetFile.bat + %1 $tmp$.bat > nul
call $tmp$.bat
del $tmp$.bat
%1 是输入文件的名称,%FileContents% 将包含调用后输入文件的内容。不过,这仅适用于单行文件(即不包含回车的文件)。如果需要,您可以在调用 %tmp%.bat 之前从文件中删除/替换回车符。
for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause