正如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
将恢复为#
。
这一切,所以即使这个解决方案显然是...
来源
2012-05-16 18:10:59
jeb
是克拉^真正的文件,或者是一个CRLF的占位符?我假设这是一台Windows机器。 – RobW
插入符号确实在文件中,它是创建包含一个换行符的变量的方式。 '设置LF = ^'后面跟两条空行 – jeb
感谢jeb的澄清 –