【问题标题】:Export/SET environment variables in windows through a shell script通过 shell 脚本在 windows 中导出/设置环境变量
【发布时间】:2021-09-02 04:29:07
【问题描述】:

有一个script.sh文件

 set FABRIC_CFG_PATH=<some path>
 set CORE_PEER_LOCALMSPID=<some id>

如果我在 Windows 中运行此脚本,则未设置 env 变量。 而如果使用 cmd 方法设置环境, 例如,在 windows cmd 上 set FABRIC_CFG_PATH=&lt;some path&gt; 它工作正常。

那么如何通过shell脚本文件在windows中设置环境呢?

【问题讨论】:

标签: powershell cmd environment-variables set export


【解决方案1】:

由于您的意图是定义仅限当前进程的环境变量(而不是持久定义的环境变量,在 Windows 上存储在注册表中)您需要使用脚本文件 / in-process 运行的批处理文件,以便脚本的调用者可以看到其中定义的环境变量。

因此:

  • 如果调用者是 cmd.exe 会话,您必须使用 批处理文件:文件扩展名为 .cmd 的纯文本文件使用cmd.exe 语法的strong>(或者,不太理想的是.bat[1])。

  • 如果调用者是 PowerShell 会话,则必须使用 PowerShell 脚本:文件扩展名为 .ps1 的纯文本文件使用 PowerShell 语法。

    • 注意:虽然您也可以从 PowerShell 调用 .cmd 文件(批处理文件)(但不能直接反之亦然),但这不会按预期工作,因为它必须在(cmd.exe) child 进程,PowerShell 调用者看不到其环境变量。

至于 .sh 文件:它们在 Windows 上没有预定义的含义,但可能由第三方应用程序定义,例如 Git Bash。在后者的情况下,调用 .sh 文件会将其传递给与 POSIX 兼容的 Bash shell,它有自己的语法。更重要的是,当从cmd.exe 或 PowerShell 调用 时,调用此类文件将无法按预期工作,因为 Bash 必须在 子进程 中运行,而子进程不能为他们的父母设置环境变量。


cmd.exe/批处理文件示例:

例如,创建一个名为 envVars.cmd 的文件,并将以下行放入其中:

@echo off
:: Note: Do NOT use `setlocal` here
set "FABRIC_CFG_PATH=C:\path\to\some directory\config"
set "CORE_PEER_LOCALMSPID=42"

然后,从你的cmd.exe会话/另一个批处理文件中,调用文件如下,使环境变量-定义对当前进程生效(假设文件在当前目录下):

.\envVars.cmd

然后您可以将新定义的变量称为%FABRIC_CFG_PATH%%CORE_PEER_LOCALMSPID%


PowerShell 示例:

例如,创建一个名为 envVars.ps1 的文件,并将以下行放入其中:

$env:FABRIC_CFG_PATH='C:\path\to\some directory\config'
$env:CORE_PEER_LOCALMSPID=42

然后,从一个 PowerShell 会话/另一个 PowerShell 脚本中,按如下方式调用该文件,以使环境变量定义对当前进程生效(假设该文件在当前目录中):

./envVars.ps1

然后您就可以将新定义的变量称为$env:FABRIC_CFG_PATH$env:CORE_PEER_LOCALMSPID


[1] 见this answer

【讨论】:

    【解决方案2】:

    在对windows中的可执行文件/批处理文件进行了一些研究之后,我得出的结论是我需要编写一个批处理.bat文件来使用set命令来设置我想要的环境变量。

    【讨论】:

    • 顺便说一句:虽然文件扩展名.bat 也可以,但.cmd 通常更可取 - 请参阅this answer
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 2019-07-21
    • 1970-01-01
    • 2015-07-26
    • 2013-09-04
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多