我有一个名为file.txt的文件,其中包含:
this is line one ^
this is line two ^
this is the last line
我怎么能把它放入env var?
我可以从批处理文件中执行此操作: test.bat的
set LF=^
[blank line]
[blank line]
rem two blank lines needed above
set multi=Line 1!LF!Line 2!LF!Last line
echo !multi!
这输出三行:
Line 1
Line 2
Last line
那么如何在批处理文件中将file.txt导入envvar?
答案 0 :(得分:7)
正如dbenham所说,也可以用for / f来完成,但它有点复杂。
简单的80%解决方案
setlocal EnableDelayedExpansion
set "var="
set LF=^
rem *** Two empty lines are required for the linefeed
FOR /F "delims=" %%a in (myFile.txt) do (
set "var=!var!!LF!%%a"
)
echo !var!
但它失败了:
- 如果一行为空白,将跳过
- 如果一行以;
EOL字符开头
- 如果一行包含!
(和插入符号)
但是你可以使用更复杂的解决方案
@echo off
SETLOCAL DisableDelayedExpansion
set "all="
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ aux1.txt"`) do (
set "line=%%a"
SETLOCAL EnableDelayedExpansion
set "line=!line:#=#S!"
set "line=!line:*:=!"
for /F "delims=" %%p in ("!all!#L!line!") do (
ENDLOCAL
set "all=%%p"
)
)
SETLOCAL EnableDelayedExpansion
if defined all (
set "all=!all:~2!"
set ^"all=!all:#L=^
!"
set "all=!all:#S=#!"
)
echo !all!
代码的作用是什么?
首先,findstr /n ^^
将在每行前面加上行号和冒号,如
1:My first Line
2:; beginning with a semicolon
3:
4:there was an empty line
这解决了空行的问题,也可以忽略标准的EOL字符;
要获取该行的内容,将该值设置为变量,同时禁用延迟扩展,这解决了!
和^
个字符的问题。
要删除行号和冒号,将启用延迟扩展(不,:
的分隔无法解决它。)
然后所有#
都替换为#S
,这将首先完成,因为删除该行的前缀可能为空并且替换将失败。
但为什么我要更换呢?
那是因为我不能在这里插入换行符,因为下面的FOR / F会因嵌入的换行符而失败,
所以我只添加换行标记(在这种情况下我使用#L
),但文件的内容也可能包含#L
,但通过替换所有#
} #S
所有标记都是唯一的。
标记后,使用endlocal
关闭/禁用延迟展开时出现问题,但保留修改后的all
和line
变量的内容。
这是通过FOR/F-endlocal
技巧完成的,因为%%p
可以在endlocal
障碍后面传输内容。
然后在阅读完整文件后,检查all
是否已定义,因为空文件为空。
然后,第一个换行标记 #L
将被删除,所有其他标记将替换为真实的换行符。
然后,更安全的#S
将恢复为#
。
这就是全部,所以即使这个解决方案显然也是......
答案 1 :(得分:2)
你快到了。您需要读取每行文本,然后将行加上换行符附加到变量。
可以使用FOR / F,但如果内容包含!
个字符,则延迟扩展效果不佳。保留空行也很尴尬,并且禁用EOL选项很难。
更简单的解决方案是使用SET / P来读取线条。这种技术的局限性是:
1)它修剪每行的尾随控制字符
2)文件必须使用回车换行的Windows标准行终止符。它不适用于Unix样式换行。
3)限制为每行读取1023个字节(不包括行终止符)
请记住,环境变量只能容纳少于8千字节的数据。因此,您只能使用此技术将非常小的文件加载到变量中。
@echo off
setlocal enableDelayedExpansion
set LF=^
:: Two blank lines above needed for definition of LF - do not remove
set file="test.txt"
set "var="
for /f %%N in ('find /c /v "" ^<%file%') do set lineCnt=%%N
<%file% (
for /l %%N in (1 1 %lineCnt%) do (
set "ln="
set /p "ln="
set "var=!var!!ln!!lf!"
)
)
set var