多行文本文件,如何放入环境变量

Doc*_*DOS 5 batch-file multiline

我有一个名为file.txt的文件,其中包含:

     this is line one ^
     this is line two ^
     this is the last line
Run Code Online (Sandbox Code Playgroud)

我怎么能把它变成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!
Run Code Online (Sandbox Code Playgroud)

这输出三行:

      Line 1
      Line 2
      Last line
Run Code Online (Sandbox Code Playgroud)

那么如何在批处理文件中将file.txt导入envvar?

jeb*_*jeb 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!
Run Code Online (Sandbox Code Playgroud)

但它失败了:
- 如果一行是空白的,它将被跳过
- 如果一行以;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!
Run Code Online (Sandbox Code Playgroud)

代码做什么?
首先,findstr /n ^^将在每行前面加上行号和冒号,如

1:My first Line
2:; beginning with a semicolon
3:
4:there was an empty line
Run Code Online (Sandbox Code Playgroud)

这解决了空行的问题,也;可以忽略标准的EOL字符.
要获取行的内容,将值设置为变量,同时禁用延迟扩展,这解决了!^字符的问题.

要删除行号和冒号,将启用延迟扩展(否,:无法解决它的分隔).

然后全部#替换为#S,这将首先完成,因为在删除行的前缀可能为空并且替换将失败.
但为什么我更换它?
那是因为我不能在这里插入换行符,因为下面的FOR/F会因嵌入的换行符而失败,
所以我只添加换行标记(在这种情况下我使用#L),但是文件的内容也可以包含a #L,但是替换所有##S所有标记是唯一的.

在标记之后,存在用a关闭/禁用延迟扩展的问题endlocal,但保留修改的allline变量的内容.
这是通过FOR/F-endlocal技巧完成的,因为%%p可以在endlocal屏障后面传输内容.

然后在读完整个文件后,检查是否all已定义,因为它对于空文件是空的.
然后将删除第一个换行标记 #L,并用实际换行符替换所有其他标记.
然后,更安全的#S将恢复到#.

这就是全部,所以即使这个解决方案显然......