通过 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变量我想要。
有一个 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 调用者看不到其环境变量。
- 注意:虽然您也可以从 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变量我想要。