首页 > 解决方案 > 如何在 Windows 命令提示符中设置具有多行文件内容的环境变量

问题描述

我有一个文件说它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 了,但这只设置第一行,而当我回显 MYVAR 时我想要所有行

请帮忙。

标签: windowsbatch-filecmdenvironment-variablesmultiline

解决方案


您使用的技术需要延迟扩展,默认情况下不启用。所以代码问题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.

推荐阅读