我有一个文件,比如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不是很感兴趣,但是可以自由地分享示例--它可能是我的备份选项)。
按照这个堆栈溢出问题的答案,Multiline text file, how to put into an environment variable,我可以得到一个变量来保存我的-file.dat的内容。但是这个变量的作用域似乎是批处理文件。尽管我从命令提示符运行批处理文件,但在命令提示符中看不到批处理文件的变量。
我尝试了set /P MYVAR=<my-file.dat,但是这只设置了第一行,而当我回显MYVAR时,我想要所有行
请帮帮忙。
发布于 2020-12-10 13:18:14
您使用的技术需要延迟展开,默认情况下不启用该扩展。所以代码会发出setlocal enableDelayedExpansion。但这会使环境变化本地化。当脚本结束时,就会有一个隐式endlocal,并且环境将恢复到setlocal之前的状态。
最简单的解决方案是在已经启用延迟扩展的会话中运行脚本,以便可以删除setlocal enableDelayedExpansion。您只需运行
在执行脚本之前,从命令行发出cmd /v:on。
还有一个简单但丑陋的选择。如果脚本有致命的语法错误(我认为这是cmd.exe中的一个bug ),则不会发生隐式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语句测试是否启用延迟展开。如果没有,则通过cmd.exe重新运行脚本,并使用/K选项和/V:ON。
@echo off
if "!!" neq "" cmd /v:on /k "%~f0"
:: rest of your script goes here.https://stackoverflow.com/questions/65232719
复制相似问题