通过 shell 脚本 windows 中的 Export/SET 环境变量

Export/SET environment variables in windows through a shell script

有一个 script.sh 文件

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

如果我 运行 这个脚本在 windows,环境变量没有设置。 而如果使用 cmd 方法设置环境, 例如,在 windows cmd set FABRIC_CFG_PATH=<some path> 效果很好。

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

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

因此:

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

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

    • 注意:虽然您也可以从 PowerShell 调用 .cmd 文件(批处理文件)(但不能直接相反),这 不会 按预期工作,由于需要它 运行s 在 (cmd.exe) child 进程中,PowerShell 调用者看不到其环境变量。

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


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

在研究了windows中的executables/batch文件后,我得出的结论是,我需要编写一个批处理.bat文件来使用set命令来设置env变量我想要。