繁体   English   中英

如何在 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的 output 与echo %MYVAR%的 output保留相同,并带有新的

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

按照这个 Stackoverflow 问题Multiline text file, how to put into an environment variable我可以得到一个变量来保存 my-file.dat 的内容。 但是这个变量的 scope 似乎是批处理文件。 即使我从命令提示符运行批处理文件,我也没有在命令提示符中看到批处理文件的变量。

我尝试set /P MYVAR=<my-file.dat ,但这仅设置第一行,而当我回显 MYVAR 时我想要所有行

请帮忙。

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

最简单的解决方案是在已启用延迟扩展的 session 中运行脚本,以便您可以删除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 的硬限制

更新

如果添加 /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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM