如何在 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.
我有一个文件说 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.