windows - 如何在 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 时我想要所有行
请帮忙。
解决方案
您使用的技术需要延迟扩展,默认情况下不启用。所以代码问题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.
推荐阅读
- python - 如何递归地遍历 2 个字典,并根据另一个修改原始字典?
- javascript - Javascript 使用过滤器问题过滤对象数组
- haskell - 模式匹配是多余的,haskell
- sharepoint - 将 Power BI 连接到 SharePoint
- ansible - 使用 ansible-vault 部署敏感数据
- json - 如何反序列化 JSON 并将特定的字符串值对序列化为不同的 JSON?
- elasticsearch - Logstash:错误:尝试运行 logstash.bat 时无法找到或加载主类堆栈
- python - xy 在 txt 文件的一行中出现的频率是多少?在 Python 中
- excel - VBA Find .address 有时返回范围,有时返回单元格
- node.js - catch(err) 给出错误但不在节点 express js 的异步函数中返回对象数据