在Windows中通过shell脚本导出/设置环境变量

6

这里有一个 script.sh 文件。

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

如果我在Windows上运行此脚本,则环境变量不会被设置。然而,如果使用cmd方法来设置环境变量,例如在Windows上的cmd中输入“set FABRIC_CFG_PATH = ”,则可以正常工作。那么如何通过shell脚本文件在Windows中设置环境变量呢?

1
请参考以下链接:https://dev59.com/7XRB5IYBdhLWcg3wHkPi 和 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.1 - Kartik Chauhan
1
这回答解决了你的问题吗?设置Windows PowerShell环境变量 - Kartik Chauhan
请更新您的问题,以澄清.sh /批处理文件混淆以及您要实现什么:进程级与持久性环境变量,谁预计会看到这些变量。 - mklement0
@mklement0 你好,实际上我不想要一个持久的环境变量。SETX 可以用于此目的。我想临时设置环境变量,因此使用 SET 命令,在命令行上运行得很好。但是如果将 set 命令放在 .sh 文件中,则会失败。 - SAURABH SINGH
2个回答

8

由于你的意图是定义仅在当前进程中有效的环境变量(而不是持久定义的环境变量,这些变量在Windows上存储在注册表中),因此你需要使用一种在进程中运行的脚本文件/批处理文件,以便在其中定义的环境变量能被脚本的调用者看到。

因此:

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

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

    • 注意:虽然你也可以从PowerShell调用.cmd文件(批处理文件),但不能直接反之亦然,因为执行它的必要过程中会创建一个(cmd.exe进程,该子进程的环境变量不会被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] 请参考这个答案


0
经过对Windows可执行文件/批处理文件的研究,我得出结论需要编写一个批处理.bat文件,使用set命令设置所需的环境变量。

顺便提一下:虽然文件名扩展名 .bat 也可以使用,但通常更推荐使用 .cmd - 参见这个答案 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接