设置Windows PowerShell环境变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置Windows PowerShell环境变量相关的知识,希望对你有一定的参考价值。

我发现设置PATH环境变量只会影响旧的命令提示符。 PowerShell似乎有不同的环境设置。如何更改PowerShell(v1)的环境变量?

注意:

我希望永久更改我的更改,因此每次运行PowerShell时都不必设置它。 PowerShell有配置文件吗?像Unix上的Bash配置文件?

答案

可以使用env: namespace / drive信息更改实际环境变量。例如,此代码将更新路径环境变量:

$env:Path = "SomeRandomPath";             (replaces existing path) 
$env:Path += ";SomeRandomPath"            (appends to existing path)

有一些方法可以永久保持环境设置,但如果您只是从PowerShell使用它们,那么使用您的配置文件启动设置可能要好得多。在启动时,PowerShell将运行它在My Documents文件夹下的WindowsPowerShell目录中找到的任何.ps1文件。通常,您已经有profile.ps1文件。我的电脑上的路径是

C:UsersJaredParDocumentsWindowsPowerShellprofile.ps1
另一答案

大多数答案都不是针对UAC。这涵盖了UAC问题。

首先通过choco install pscx安装PowerShell社区扩展:http://chocolatey.org/(您可能必须重新启动shell环境)。

然后启用pscx

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx

然后使用Invoke-Elevated

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR
另一答案

@Michael Kropat's回答的基础上,我添加了一个参数来预先添加现有PATHvariable的新路径,并检查以避免添加不存在的路径:

function Add-EnvPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Path,

        [ValidateSet('Machine', 'User', 'Session')]
        [string] $Container = 'Session',

        [Parameter(Mandatory=$False)]
        [Switch] $Prepend
    )

    if (Test-Path -path "$Path") {
        if ($Container -ne 'Session') {
            $containerMapping = @{
                Machine = [EnvironmentVariableTarget]::Machine
                User = [EnvironmentVariableTarget]::User
            }
            $containerType = $containerMapping[$Container]

            $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
            if ($persistedPaths -notcontains $Path) {
                if ($Prepend) {
                    $persistedPaths = ,$Path + $persistedPaths | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
                else {
                    $persistedPaths = $persistedPaths + $Path | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
            }
        }

        $envPaths = $env:Path -split ';'
        if ($envPaths -notcontains $Path) {
            if ($Prepend) {
                $envPaths = ,$Path + $envPaths | where { $_ }
                $env:Path = $envPaths -join ';'
            }
            else {
                $envPaths = $envPaths + $Path | where { $_ }
                $env:Path = $envPaths -join ';'
            }
        }
    }
}
另一答案

我的建议就是这个,我已经测试了这个将C: oracle x64 bin永久添加到Path,这很好用。

$ENV:PATH

第一种方法就是:

$ENV:PATH=”$ENV:PATH;c:path	ofolder”

但是这个改变并不是永久性的,$ env:只要你关闭你的powershell终端并重新打开它,路径就会默认回到之前的状态。这是因为您已在会话级别而不是源级别(即注册表级别)应用了更改。要查看$ env:path的全局值,请执行以下操作:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment’ -Name PATH

或者,更具体地说:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment’ -Name PATH).path

现在要更改它,首先我们捕获需要修改的原始路径:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment’ -Name PATH).path

现在我们定义新路径应该是什么样子,在这种情况下我们要附加一个新文件夹:

$newpath = “$oldpath;c:path	ofolder”

注意:确保$ newpath看起来如何看,如果没有,那么你可能会损坏你的操作系统。

现在应用新值:

Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment’ -Name PATH -Value $newPath

现在做一个最终检查它看起来你期望它:

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment’ -Name PATH).Path

您现在可以重新启动powershell终端(甚至重启机器)并看到它不会再次回滚到它的旧值。请注意,路径的顺序可能会改变,因此它按字母顺序排列,因此请确保检查整行,以便更容易,您可以使用分号作为分隔符将输出拆分为行:

($env:path).split(“;”)
另一答案

我尝试优化SBF'sMichael's代码以使其更紧凑。

我依赖于PowerShell的类型强制,它自动将字符串转换为枚举值,所以我没有定义查找字典。

我还根据条件拉出了将新路径添加到列表中的块,以便工作完成一次并存储在变量中以便重复使用。

然后根据$PathContainer参数将其永久或仅应用于Session。

我们可以将代码块放在我们直接从命令提示符调用的函数或ps1文件中。我选择了DevEnvAddPath.ps1。

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session',
    [Parameter(Position=2,Mandatory=$false)][Boolean]$PathPrepend=$false
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -notcontains $PathChange) {
    $PathPersisted = $(switch ($PathPrepend) { $true{,$PathChange + $PathPersisted;} default{$PathPersisted + $PathChange;} }) | Where-Object { $_ };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

我为DevEnvRemovePath.ps1做了类似的事情。

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session'
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -contains $PathChange) {
    $PathPersisted = $PathPersisted | Where-Object { $_ -ne $PathChange };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

到目前为止,他们似乎工作。

另一答案

打开PowerShell并运行:

[Environment]::SetEnvironmentVariable("PATH", "$ENV:PATH;<path to exe>", "USER")
另一答案

如果,在PowerShell会话期间的某个时间,您需要临时追加到PATH环境变量,您可以这样做:

$env:Path += ";C:Program FilesGnuWin32in"
另一答案

您还可以使用以下命令永久修改用户/系统环境变量(即,将在shell重新启动时保持持久性):

### Modify a system environment variable ###
[Environment]::SetEnvironmentVariable
     ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)

### Modify a user environment variable ###
[Environment]::SetEnvironmentVariable
     ("INCLUD

以上是关于设置Windows PowerShell环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Powershell命令行设置代理

powershell 在Windows中设置环境变量

[No0000105]java sdk 开发环境变量powershell 自动配置脚本

powershell PowerShell的下设置环境变量

windows 修改环境变量后在 vscode 的终端不生效的解决方法

如何从 powershell 中为 bash 设置环境变量?