如何在 windows 命令提示符中设置具有多行文件内容的环境变量

How to set an env variable with multiline file content in windows command prompt

我有一个文件说 my-file.dat,它有多行。我想设置一个环境变量,比如 MYVAR,它将包含 my-file.dat 的内容。 也就是说,在 windows 命令提示符下,type my-file.dat 的输出与 echo %MYVAR% 的输出相同,并保留换行符 .

在 RHEL/MAC 中,它通常是这样完成的 export MYVAR=$(cat my-file.dat),但是我如何在 windows 命令提示符中做类似的事情(对 powershell 不是很感兴趣,但随意分享示例,它可能是我的备用选项)

根据这个 Whosebug 问题 Multiline text file, how to put into an environment variable 的答案,我可以获得一个变量来保存 my-file.dat 的内容。但是这个变量的范围似乎是批处理文件。即使我从命令提示符 运行 批处理文件,我也看不到批处理文件的变量在命令提示符中可用。

我试过 set /P MYVAR=<my-file.dat ,但这只设置了第一行,而当我回显 MYVAR

时我想要所有行

请帮忙。

您使用的技术需要延迟扩展,默认情况下不启用。所以代码问题setlocal enableDelayedExpansion。但这会使环境变化局部化。当脚本结束时,有一个隐含的 endlocal,并且环境恢复到 setlocal.

之前存在的状态

最简单的解决方案是 运行 已启用延迟扩展的会话中的脚本,以便您可以删除 setlocal enableDelayedExpansion。您可以简单地通过 运行ning
cmd /v:on 在执行脚本之前从你的命令行。

还有一个简单但丑陋的选项。如果您的脚本有致命的语法错误(我认为这是 cmd.exe 中的错误),则不会出现隐式 endlocal。因此,您可以在脚本末尾添加以下内容:

:: Your current script goes here.
:: I'm assuming your script falls through to the end and does not use EXIT /B

call :fatalErr 2>nul

:fatalErr
if

但如果您可能多次执行脚本,我不鼓励您使用此技术 - 您的死环境将开始堆积。

此外 - 请记住变量限制为 ~8191 个字符 - 如果您尝试捕获的文件超出限制,您的脚本将失败。这是 cmd.exe

的硬性限制

更新

如果添加 /K 选项,则可以将 cmd /v:on 命令放入脚本中。 IF 语句测试是否启用延迟扩展。如果不是,则它会通过 cmd.exe 使用 /K 选项和 /V:ON 重新 运行 脚本。

@echo off
if "!!" neq "" cmd /v:on /k "%~f0"
:: rest of your script goes here.