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

我有一个文件说它my-file.dat有多行。我想设置一个 env 变量,说MYVAR它将包含 my-file.dat 的内容。即,在Windows命令提示,的输出type my-file.dat是相同的输出echo %MYVAR%具有保持的新行

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

按照这个 Stackoverflow question 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. 您只需
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 的硬限制

更新

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

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


以上是如何在Windows命令提示符中设置具有多行文件内容的env变量的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>