首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在windows命令提示符中设置包含多行文件内容的env变量

如何在windows命令提示符中设置包含多行文件内容的env变量
EN

Stack Overflow用户
提问于 2020-12-10 10:26:35
回答 1查看 1.1K关注 0票数 3

我有一个文件,比如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时,我想要所有行

请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-10 13:18:14

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

最简单的解决方案是在已经启用延迟扩展的会话中运行脚本,以便可以删除setlocal enableDelayedExpansion。您只需运行

在执行脚本之前,从命令行发出cmd /v:on

还有一个简单但丑陋的选择。如果脚本有致命的语法错误(我认为这是cmd.exe中的一个bug ),则不会发生隐式endlocal。因此,您可以将以下内容放在脚本的末尾:

代码语言:javascript
复制
:: 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。

代码语言:javascript
复制
@echo off
if "!!" neq "" cmd /v:on /k "%~f0"
:: rest of your script goes here.
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65232719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档