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

问题描述 投票:0回答:2

有一个script.sh文件

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

如果我在 Windows 中运行此脚本,则不会设置环境变量。 而如果使用 cmd 方法设置 env, 例如,在 Windows cmd 上

set FABRIC_CFG_PATH=<some path>
效果很好。

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

powershell cmd environment-variables set export
2个回答
9
投票

因为您的意图是定义仅当前进程环境变量(而不是持久定义的变量,在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,该 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] 请参阅此答案


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.