【问题标题】:How to set an env variable with multiline file content in windows command prompt如何在 Windows 命令提示符中设置具有多行文件内容的环境变量
【发布时间】:2023-03-12 13:10:02
【问题描述】:

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

请帮忙。

【问题讨论】:

    标签: windows batch-file cmd environment-variables multiline


    【解决方案1】:

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

    更新

    如果添加 /K 选项,您可以将 cmd /v:on 命令放入脚本中。 IF 语句测试是否启用延迟扩展。如果不是,则它通过带有 /K 选项和 /V:ON 的 cmd.exe 重新运行脚本。

    @echo off
    if "!!" neq "" cmd /v:on /k "%~f0"
    :: rest of your script goes here.
    

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 2021-10-14
      • 2021-11-06
      • 1970-01-01
      • 2020-07-06
      • 2010-09-15
      • 2022-10-15
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多