如果一个env变量不存在,如何在PowerShell中设置它?

bejyjqdl  于 2023-02-23  发布在  Shell
关注(0)|答案(3)|浏览(190)

我很惊讶,我没有得到这个常见的情况后,谷歌搜索了一会儿的答案...
如果中的环境变量不存在,如何在PowerShell中设置它?

e5nqia27

e5nqia271#

下面的代码为当前进程定义环境变量FOO(如果它还不存在)。

if ($null -eq $env:FOO) { $env:FOO = 'bar' }

# If you want to treat a *nonexistent* variable the same as
# an existent one whose value is the *empty string*, you can simplify to:
if (-not $env:FOO) { $env:FOO = 'bar' }

# Alternatively:
if (-not (Test-Path env:FOO)) { $env:FOO = 'bar' }

# Or even (quietly fails if the variable already exists):
New-Item -ErrorAction Ignore env:FOO -Value bar

在 * PowerShell(Core)7.1 +* 中,它具有空合并运算符,您可以简化为:

$env:FOO ??= 'bar'

注:
根据定义,环境变量是 * 字符串 *。如果给定的环境变量是 * 定义的 ,但 * 没有值 ,则其值为 * 空字符串 '')而不是$null。因此,与$null进行比较可用于区分 * 未定义 * 环境变量和 * 已定义但没有值 * 的环境变量。但是,请注意,在PowerShell/. NET * 中 * 将 * 分配给 * 环境变量 * 会 * 不 * 区分$null'',并且 * 任何一个 * 值都会导致 * 取消定义(删除) 目标环境变量;类似地,在cmd.exeset FOO=中,会导致删除/不定义变量FOO,并且GUI对话框(可通过sysdm.cpl访问)也不允许您使用空字符串定义变量。但是,Windows API(SetEnvironmentVariable 不 * 允许创建包含空字符串的环境变量。
在类Unix平台上,空字符串值也是允许的,并且本地的、POSIX兼容的shell(例如bash/bin/sh)-不像PowerShell-
也 * 允许您创建它们(例如export FOO=)。注意,Unix上的环境变量定义和查找是区分大小写的,这与Windows不同。
注意:如果环境变量是通过上述赋值语句($env:FOO = ...)按需创建的,则当前进程及其创建的任何 * 子进程 * 都将存在该环境变量谢谢,PetSerAl
以下内容主要由Ansgar Wiechers贡献,并由Mathias R. Jessen补充:

# user environment
[Environment]::SetEnvironmentVariable('FOO', 'bar', 'User')

# system environment (requires admin privileges)
[Environment]::SetEnvironmentVariable('FOO', 'bar', 'Machine')

请注意,这些定义在 * 未来 * 会话(进程)中生效,因此为了为 * 当前 * 进程 * 以及*定义变量,请另外运行$env:FOO = 'bar' *,这实际上与[Environment]::SetEnvironmentVariable('FOO', 'bar', 'Process')相同。
[Environment]::SetEnvironmentVariable()UserMachine一起使用时,会向其他应用程序发送一条WM_SETTINGCHANGE消息,通知它们发生了更改(尽管很少有应用程序会对此类通知做出React)。
这不适用于以Process为目标时(或赋值给$env:FOO时),因为其他应用程序(进程)无论如何都无法看到该变量。
另请参见:Creating and Modifying Environment Variables(TechNet文章)。
[*]从. NET(Core)7开始,在类似Unix的平台上,针对 * persistent * 作用域(UserMachine)的尝试会被 * 悄悄忽略 *,而且这种不支持定义持久环境变量的情况不太可能改变,因为缺乏跨Unix平台的统一机制。

ifsvaxew

ifsvaxew2#

    • 代码**
function Set-LocalEnvironmentVariable {
    param (
        [Parameter()]
        [System.String]
        $Name,

        [Parameter()]
        [System.String]
        $Value,

        [Parameter()]
        [Switch]
        $Append
    )
    if($Append.IsPresent)
    {
        if(Test-Path "env:$Name")
        {
            $Value = (Get-Item "env:$Name").Value + $Value
        }
    }
    Set-Item env:$Name -Value "$value" | Out-Null
}

function Set-PersistentEnvironmentVariable {
    param (
        [Parameter()]
        [System.String]
        $Name,
    
        [Parameter()]
        [System.String]
        $Value,
    
        [Parameter()]
        [Switch]
        $Append        
    )
    
    Set-LocalEnvironmentVariable -Name $Name -Value $Value -Append:$Append
    if ($Append.IsPresent) {
        $value = (Get-Item "env:$Name").Value
    }
    
    if ($IsWindows) {
        setx "$Name" "$Value" | Out-Null
        return
    }
    $pattern = "\s*export[ \t]+$Name=[\w]*[ \t]*>[ \t]*\/dev\/null[ \t]*;[ \t]*#[ \t]*$Name\s*"
    
    if ($IsLinux) {
        $file = "~/.bash_profile"
        $content = (Get-Content "$file" -ErrorAction Ignore -Raw) + [System.String]::Empty
        $content = [System.Text.RegularExpressions.Regex]::Replace($content, $pattern, [String]::Empty);
        $content += [System.Environment]::NewLine + [System.Environment]::NewLine + "export $Name=$Value > /dev/null ;  # $Name"
        Set-Content "$file" -Value $content -Force
        return
    }
    if ($IsMacOS) {
        $file = "~/.zprofile"
        $content = (Get-Content "$file" -ErrorAction Ignore -Raw) + [System.String]::Empty
        $content = [System.Text.RegularExpressions.Regex]::Replace($content, $pattern, [String]::Empty);
        $content += [System.Environment]::NewLine + [System.Environment]::NewLine + "export $Name=$Value > /dev/null ;  # $Name"
        Set-Content "$file" -Value $content -Force
        return
    }
    throw "Invalid platform."
}
      • 函数Set-PersistentEnvironmentVariable**设置实际流程和系统中的变量/值,该函数调用Set-LocalEnvironmentVariable函数,设置流程范围变量,并在机器范围内执行设置变量的任务。

在Windows上,您可以使用:

    • *[Environment]::SetEnvironmentVariable**具有计算机作用域,用户或计算机不能在Linux或MacOS上运行

在Linux上,我们可以将export VARIABLE_NAME = Variable value添加到文件**~/. bash_profile中。对于新的bash终端,进程执行位于~/. bash_profile中的这些指令。
在MacOS上类似于Linux,但是如果你有
zsh终端**,文件是**. zprofile**,如果默认终端是bash,文件是**. bash_profile**。在我的函数代码中,如果你愿意,我们需要添加对默认终端的检测。我假设默认终端是zsh

      • 函数Set-LocalEnvironmentVariable在实际过程中设置变量/值。使用驱动器env:**。
    • 示例**
#Set "Jo" value to variable "NameX", this value is accesible in current process and subprocesses, this value is accessible in new opened terminal.
Set-PersistentEnvironmentVariable -Name "NameX" -Value "Jo"; Write-Host $env:NameX

#Append value "ma" to current value of variable "NameX", this value is accesible in current process and subprocesses, this value is accessible in new opened terminal.
Set-PersistentEnvironmentVariable -Name "NameX" -Value "ma" -Append; Write-Host $env:NameX

#Set ".JomaProfile" value to variable "ProfileX", this value is accesible in current process/subprocess.
Set-LocalEnvironmentVariable "ProfileX" ".JomaProfile"; Write-Host $env:ProfileX
    • 产出**
    • windows 10**
    • Ubuntu WSL**
    • 参考资料**

检查环境变量
Shell initialization files
ZSH: .zprofile, .zshrc, .zlogin - What goes where?

zysjyyx4

zysjyyx43#

如果PowerShell中的环境变量不存在,您可以使用以下代码设置该变量:

if (!(Test-Path -Path Env:VAR_NAME)) {
    New-Item -Path Env:VAR_NAME -Value "VAR_VALUE"
}

将VAR_NAME替换为环境变量的名称,将VAR_VALUE替换为所需的值。

相关问题