如何在Windows命令提示符中使用多行文件内容设置环境变量

3
我有一个名为my-file.dat的文件,其中有多行内容。我想设置一个环境变量,比如说MYVAR,它将包含my-file.dat的内容,并且在Windows命令提示符下,type my-file.dat的输出应该与echo %MYVAR%的输出相同,并保留换行符
在RHEL/MAC中,通常是这样做的:export MYVAR=$(cat my-file.dat), 但如何在Windows命令提示符下执行类似操作(虽然我不是非常感兴趣PowerShell,但请随意分享示例,它可能是我的备选项)。
根据这个Stackoverflow问题Multiline text file, how to put into an environment variable的答案,我可以获得一个变量来保存my-file.dat的内容。但是这个变量的作用域似乎只是批处理文件。即使我从命令提示符运行批处理文件,我也看不到批处理文件的变量在命令提示符中可用。
我尝试了set /P MYVAR=<my-file.dat,但这仅设置了第一行,而我想要的是当我echo MYVAR时显示所有行。
请帮忙。
1个回答

6
您使用的技术需要延迟扩展,但默认情况下未启用。因此代码会发出 setlocal enableDelayedExpansion 命令。但是这会将环境变更本地化。脚本结束时会有一个隐式的 endlocal,它会将环境还原为 setlocal 命令执行之前的状态。
最简单的解决方案是在已启用延迟扩展的会话中运行脚本,以便您可以删除 setlocal enableDelayedExpansion 命令。您可以在执行脚本之前从命令行运行 cmd /v:on 来轻松完成此操作。
还有另一种简单但不太美观的选择。如果脚本存在致命语法错误,则不会发生隐式的 endlocal(我认为这是 cmd.exe 中的 bug)。因此,您可以将以下内容放在脚本末尾:
:: 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语句测试是否启用了延迟扩展。如果没有,则通过带有/K选项和/V:ON的cmd.exe重新运行脚本。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接