Windows PowerShell ortam değişkenlerini ayarlama


607

PATH ortam değişkenini ayarlamanın yalnızca eski komut istemini etkilediğini öğrendim. PowerShell'in farklı ortam ayarları var gibi görünüyor. PowerShell (v1) ortam değişkenlerini nasıl değiştirebilirim?

Not:

Değişikliklerimi kalıcı yapmak istiyorum, bu yüzden PowerShell'i her çalıştırdığımda ayarlamak zorunda değilim. PowerShell'in bir profil dosyası var mı? Unix'teki Bash profili gibi bir şey mi?


1
Bir dosya paylaşımında merkezi bir profil olmasını istiyorum. Senkronizasyon bir acıdır. İle bir saplama profili oluşturma. \\ bilgisayar \ paylaşım \ yol \ Profile.ps1 bir çamur gibi görünüyor (Not Defteri $ Profili'ni deneyin). $ Profile otomatik değişkenini kalıcı olarak değiştirmenin bir yolu olsaydı iyi olurdu.
Nathan Hartley

5
PATH ortamı da powershell komut istemini etkilemez. Farklı olan şey, powershell'in tırnak işaretleri içine alınmış yolları kabul etmemesidir. Çözüm: "yol ortamı değişkenindeki tüm tırnak işaretlerini ( ) kaldırın
Nilzor

3
PS> v1 İÇİN BURADA: EĞER… Yukarıdaki Nilzor'un yorumuna ek olarak: Bunu, oturumunuz için PATH ortam değişkenindeki yollardan "kaldırmak için kullanın:$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
d3r3kk

Yanıtlar:


478

Gerçek ortam değişkenlerinin değiştirilmesi env: namespace / drivebilgiler kullanılarak yapılabilir . Örneğin, bu kod yol ortam değişkenini güncelleyecektir:

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

Ortam ayarlarını kalıcı hale getirmenin yolları vardır, ancak bunları yalnızca PowerShell'den kullanıyorsanız, ayarları başlatmak için profilinizi kullanmak muhtemelen çok daha iyidir. Başlangıçta PowerShell, Belgelerim klasörü altındaki dizinde bulduğu tüm .ps1 dosyalarını çalıştırır WindowsPowerShell. Genellikle zaten bir profile.ps1 dosyanız vardır. Bilgisayarımdaki yol

C:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1

38
$ profile, tüm PowerShell ana bilgisayarları için kullanıcı profilinizi gösteren otomatik bir değişkendir.
JasonMArcher

16
(Split-path $ profile) (içeren klasörü almak için) birden fazla profil dosyası içerebileceğini unutmayın: profile.ps1, tüm ana bilgisayarlar tarafından yüklenmelidir, <host-name> _profile.ps1 yalnızca belirtilen ana bilgisayar tarafından yüklenmelidir. PowerShell.exe (konsol ana bilgisayarı) için bu Microsoft.PowerShell_profile.ps1'dir.
Richard

10
Belgelerimde WindowsPowerShell klasörü yoksa ne olur? Klasörü ve dosyayı oluşturmalı mıyım? C:\path\to\file.extOrtam değişkenlerine eklemek istersem dosyaya ne koymalıyım ? EDIT: zaten buldum. Cevap evet, yarat. Dosya 1 satır oluşmalıdır: $env:path += ;C:\path\to\file.ext".
Lewistrick

7
@Lewistrick Varsayılan olarak bir profiliniz yoktur. Bir tane oluşturmak için bu talimatları izledim
MikeB 13:15

16
Bunu yaparken dikkatli olun - mevcut yolunuzu tıkayacaktır. $env:Path = "SomeRandomPath"; Bunun yerine, aşağıdaki mloskot'a bakın.
John Mark

626

Bir PowerShell oturumu sırasında bir süre için, geçici olarak PATH ortam değişkenine eklemeniz gerekiyorsa, bunu şu şekilde yapabilirsiniz:

$env:Path += ";C:\Program Files\GnuWin32\bin"

4
+1 :: Bu tek astar, mingw'de olduğu gibi oturum tabanlı çağrılar için oldukça etkilidir ... IE $ env: PATH + = "; c: \ MinGW \ msys \ 1.0 \ bin" ^ {bazı mingw bin ... }
Eddie B

2
ve bir yolu nasıl kaldırabilirim?
becko

11
$env:Path = "C:\MyPath;$env:Path"
Yolunuzun

4
**** @Kevin'in yorumunda görüldüğü gibi, ekleme dizesinin başında noktalı virgül unutmayın. Bu oldukça açıktır, ancak kodu cevaba kopyalayıp yapıştırırsanız ve mevcut yolun sonunda noktalı virgül yoksa kaçırılabilir. Bir düzenleme göndermeye çalışacağım.
Matt Goodrich

1
Önceki düzeltmeye @MattGoodrich ben oldum geri alma
Coeur

278

Ayrıca, kullanıcı / sistem ortam değişkenlerini aşağıdakilerle kalıcı olarak değiştirebilirsiniz (örn. Kabuk yeniden başlatmalarında kalıcı olacaktır):

Sistem ortamı değişkenini değiştirme

[Environment]::SetEnvironmentVariable
     ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)

Bir kullanıcı ortamı değişkenini değiştirme

[Environment]::SetEnvironmentVariable
     ("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)

Yorumlardan kullanım - sistem ortamı değişkenine ekleyin

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
    [EnvironmentVariableTarget]::Machine)

Tür yazmak istemiyorsanız, dize tabanlı çözüm de mümkündür

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")

6
Bu, sınırlı erişim sistemleri için çok kullanışlıdır.
h0tw1r3

14
@AndresRiofrio, Evet, bu kalıcı. Kullanım: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) Yeni bir powershell oturumu başlatana kadar bu değişikliğin sonucunu görmezsiniz. Yani, bu komutu çalıştırdıktan hemen sonra $ env: Path öğesini incelerseniz, komuttan önce $ env: Path'un ne olduğunu göreceksiniz. Güncellemek için kabuğu kapatın ve açın veya yeni bir oturum başlatın.
FLGMwt

7
@FLGMwt bir yazım hatası var, doğru: [Çevre] :: SetEnvironmentVariable ("Yol", $ env: Yol + "; C: \ bin", [EnvironmentVariableTarget] :: Makine)
enthus1ast

10
Tüm .NET numaralandırma yerine "Makine" veya "Kullanıcı" dizesini yazabilirsiniz. Gönderen Technet'te .
bouvierr

3
Bu cevabın ayrıca kullanıcı değişkenini ayarlamak için kullanımı da göstermesi gerektiğini düşünüyorum[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Saito

63

PowerShell isteminden:

setx PATH "$env:path;\the\directory\to\add" -m

Daha sonra metni görmelisiniz:

SUCCESS: Specified value was saved.

Oturumunuzu yeniden başlatın, değişken kullanılabilir. setxrastgele değişkenleri ayarlamak için de kullanılabilir. Tip setx /?belgeleri için isteminde.

Yolunuzu bu şekilde karıştırmadan önce, $env:path >> a.outPowerShell isteminde yaparak mevcut yolunuzun bir kopyasını kaydettiğinizden emin olun .


5
Yalnızca 'yönetici olarak çalışırken' işe yarıyor gibi görünüyor ve daha sonra düzenli olarak çalışanları değil, yalnızca 'yönetici olarak çalışan' PowerShell konsolları için geçerli olacaktır.
matanster


12
Ah - sadece setx'in 1024 karakter sınırından etkilendi; Neyse ki $ end: Path'ın mevcut değerini kaydetmek için tavsiyelere uydum.
Dikkat

3
Neden $env:PATHönce ayarlanmadı , o zaman setx /m PATH "$env:PATH"kabuk yeniden başlatma olmadan yerel ve global olarak uygulanacak?
tresf

1
Güzel! Setx yerel bir cmdlet olmasa da, iğrenç uzun soluklu .NET Framework çağrılarına hala çok daha iyi ve kolayca unutulan bir alternatif! Yine de Powershell 7'nin bile envvarları devam ettirmek için resmi bir cmdlet ile gelmediği şaşırtıcıdır. Ne. 'Ls' ile eşlik etmesi gereken bir özellik gibi geliyor.
Jonas

27

Gibi JeanT cevabı , ben yola ekleme etrafında bir soyutlama istedi. JeanT'nin cevabından farklı olarak kullanıcı etkileşimi olmadan çalışması gerekiyordu. Aradığım diğer davranışlar:

  • Güncellemeler $env:Pathdeğişim böylece geçerli oturumda ayında yürürlüğe girecek
  • Gelecek oturumlar için ortam değişkeni değişikliğini sürdürür
  • Aynı yol zaten mevcutsa yinelenen bir yol eklemez

Yararlı olması durumunda, işte burada:

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

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

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

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

    $envPaths = $env:Path -split ';'
    if ($envPaths -notcontains $Path) {
        $envPaths = $envPaths + $Path | where { $_ }
        $env:Path = $envPaths -join ';'
    }
}

İlgili işlev için özgeçmişime bakın Remove-EnvPath.


16

Geçerli kabul edilen yanıt, path değişkeninin PowerShell bağlamından kalıcı olarak güncellenmesi anlamında çalışmasına rağmen, aslında Windows kayıt defterinde depolanan ortam değişkenini güncellemez.

Bunu başarmak için PowerShell'i de kullanabilirsiniz:

$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

$newPath=$oldPath+’;C:\NewFolderToAddToTheList\’

Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH Value $newPath

Daha fazla bilgi blog yayınındadır Çevresel Yolunuzu Değiştirmek için PowerShell'i Kullanma

PowerShell topluluk uzantılarını kullanıyorsanız, ortam değişkeni yoluna yol eklemek için uygun komut şöyledir:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine

12

Kalıcı bir değişiklik öneren tüm yanıtlar aynı soruna sahiptir: Yol kayıt defteri değerini bozarlar.

SetEnvironmentVariabledöner REG_EXPAND_SZdeğer %SystemRoot%\system32 bir içine REG_SZdeğeri C:\Windows\system32.

Yoldaki diğer değişkenler de kaybolur. Kullanarak yenilerini eklemek %myNewPath%artık işe yaramayacak.

İşte Set-PathVariable.ps1bu sorunu gidermek için kullandığım bir komut dosyası :

 [CmdletBinding(SupportsShouldProcess=$true)]
 param(
     [parameter(Mandatory=$true)]
     [string]$NewLocation)

 Begin
 {

 #requires –runasadministrator

     $regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
     $hklm = [Microsoft.Win32.Registry]::LocalMachine

     Function GetOldPath()
     {
         $regKey = $hklm.OpenSubKey($regPath, $FALSE)
         $envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
         return $envPath
     }
 }

 Process
 {
     # Win32API error codes
     $ERROR_SUCCESS = 0
     $ERROR_DUP_NAME = 34
     $ERROR_INVALID_DATA = 13

     $NewLocation = $NewLocation.Trim();

     If ($NewLocation -eq "" -or $NewLocation -eq $null)
     {
         Exit $ERROR_INVALID_DATA
     }

     [string]$oldPath = GetOldPath
     Write-Verbose "Old Path: $oldPath"

     # Check whether the new location is already in the path
     $parts = $oldPath.split(";")
     If ($parts -contains $NewLocation)
     {
         Write-Warning "The new location is already in the path"
         Exit $ERROR_DUP_NAME
     }

     # Build the new path, make sure we don't have double semicolons
     $newPath = $oldPath + ";" + $NewLocation
     $newPath = $newPath -replace ";;",""

     if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){

         # Add to the current session
         $env:path += ";$NewLocation"

         # Save into registry
         $regKey = $hklm.OpenSubKey($regPath, $True)
         $regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
         Write-Output "The operation completed successfully."
     }

     Exit $ERROR_SUCCESS
 }

Bir blog gönderisinde sorunu daha ayrıntılı olarak açıklarım .


Bu olursa: $ newPath = $ newPath -replace ";;", ";" ?
Joe Johnston

8

Bu, geçerli oturumun yolunu belirler ve kullanıcıdan oturumu kalıcı olarak eklemesini ister:

function Set-Path {
    param([string]$x)
    $Env:Path+= ";" +  $x
    Write-Output $Env:Path
    $write = Read-Host 'Set PATH permanently ? (yes|no)'
    if ($write -eq "yes")
    {
        [Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User)
        Write-Output 'PATH updated'
    }
}

Bu işlevi Microsoft.PowerShell_profile.ps1genellikle adresinde bulunan varsayılan profilinize ( ) ekleyebilirsiniz %USERPROFILE%\Documents\WindowsPowerShell.


6

Bina @Michael Kropat en cevabını ben mevcut yeni yolunu başına gelecek bir parametre eklendi PATHvar olmayan bir yolun eklenmesini önlemek için değişken ve bir çek:

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 ';'
            }
        }
    }
}

5

As Jonathan Liderler sözü burada , komut / script için değişim ortam değişkenleri edebilmek için yükseltilmiş çalıştırmak için önemlidir 'makine' , ancak yükseltilmiş bazı komutları çalıştırarak İsterdim yüzden, Topluluk Uzantıları ile yapılabilir zorunda değildir JeanT'nin cevabını bir şekilde değiştirmek ve genişletmek için , komut dosyasının kendisi çalıştırılmasa bile makine değişkenlerini değiştirmenin de gerçekleştirilebileceğini:

function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false )
{
    $Env:Path += ";$newPath"

    $scope = if ($forMachine) { 'Machine' } else { 'User' }

    if ($permanent)
    {
        $command = "[Environment]::SetEnvironmentVariable('PATH', $env:Path, $scope)"
        Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas
    }

}

5

Çoğu yanıt UAC'ye yönelik değildir . Bu UAC sorunlarını kapsar.

İlk PowerShell Topluluk Uzantıları yükleyin: choco install pscxaracılığı http://chocolatey.org/ (eğer kabuk ortamı yeniden başlatmanız gerekebilir).

Sonra pscx'i etkinleştirin

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

Sonra kullan Invoke-Elevated

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

4

Benim önerim şu:

C:\oracle\x64\binOrtam değişkenine Pathkalıcı olarak eklemek için bunu test ettim ve bu iyi çalışıyor.

$ENV:PATH

İlk yol basitçe:

$ENV:PATH=”$ENV:PATH;c:\path\to\folder

Ancak bu değişiklik kalıcı değildir. $env:pathPowerShell terminalinizi kapatır kapatmaz tekrar açar açmaz varsayılan ayar öncekine döner. Bunun nedeni, değişikliği kaynak düzeyinde değil, oturum düzeyinde uygulamanızdır (kayıt defteri düzeyidir). Değerinin genel değerini görüntülemek için şunu yapın $env:path:

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment -Name PATH

Veya daha spesifik olarak:

(Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment -Name PATH).path

Şimdi bunu değiştirmek için, önce değiştirilmesi gereken orijinal yolu yakalarız:

$oldpath = (Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment -Name PATH).path

Şimdi yeni yolun nasıl olması gerektiğini tanımlarız. Bu durumda yeni bir klasör ekliyoruz:

$newpath = $oldpath;c:\path\to\folder

Not: emin olun $newpath Görünüşün nasıl görünmesini istediğinizden . Değilse, işletim sisteminize zarar verebilirsiniz.

Şimdi yeni değeri uygulayın:

Set-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment -Name PATH -Value $newPath

Şimdi, nasıl olmasını beklediğinize benzediğine dair son bir kontrol yapın:

(Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment -Name PATH).Path

Artık PowerShell terminalinizi yeniden başlatabilir (hatta makineyi yeniden başlatabilir) ve eski değerine geri dönmediğini görebilirsiniz.

Yolların sırasının alfabetik sıraya göre değişebileceğini unutmayın, bu nedenle tüm satırı kontrol ettiğinizden emin olun. Bunu kolaylaştırmak için, noktalı virgül ayırıcı olarak kullanarak çıktıyı satırlara bölebilirsiniz:

($env:path).split(“;”)

3

PowerShell'i açın ve çalıştırın:

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

1

PowerShell içinde, aşağıdakileri yazarak ortam değişkeni dizinine gidilebilir:

Set-Location Env:

Bu sizi Env:> dizinine getirecektir. Bu dizinin içinden:

Tüm ortam değişkenlerini görmek için şunu yazın:

Env:\> Get-ChildItem

Belirli bir ortam değişkenini görmek için şunu yazın:

Env:\> $Env:<variable name>, e.g. $Env:Path

Bir ortam değişkeni ayarlamak için şunu yazın:

Env:\> $Env:<variable name> = "<new-value>", e.g. $Env:Path="C:\Users\"

Bir ortam değişkenini kaldırmak için şunu yazın:

Env:\> remove-item Env:<variable name>, e.g. remove-item Env:SECRET_KEY

Çevre Değişkenleri Hakkında bölümünde daha fazla bilgi bulunmaktadır .


0

SBF'leri ve Michael'ları optimize etmeye çalıştımDaha kompakt hale getirmek için kodunu biraz .

PowerShell'in otomatik olarak dizeleri numaralandırma değerlerine dönüştürdüğü türdeki baskıya güveniyorum, bu yüzden arama sözlüğünü tanımlamamıştım.

Ayrıca, bir koşula bağlı olarak listeye yeni yol ekleyen bloğu çıkardım, böylece iş bir kez yapılır ve yeniden kullanım için bir değişkende saklanır.

Daha sonra kalıcı olarak veya sadece $PathContainer parametreye .

Kod bloğunu doğrudan komut isteminden çağırdığımız bir fonksiyona veya ps1 dosyasına koyabiliriz. DevEnvAddPath.ps1 ile gittim.

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 için benzer bir şey yapıyorum.

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;

Şimdiye kadar çalışıyor gibi görünüyorlar.


0

Sadece kayıt içine değerini itmek cevaplar etkileyen kalıcı bir değişim (kabul yanıt dahil olmak üzere bu parçacığı üzerinde cevapların çoğunluğu, bu yüzden, do not kalıcı etkiler Path).

Aşağıdaki işlev hem Path/ PSModulePathve User/ Systemtürleri için çalışır . Ayrıca varsayılan olarak geçerli oturuma yeni yol ekleyecektir.

function AddTo-Path {
    param ( 
        [string]$PathToAdd,
        [Parameter(Mandatory=$true)][ValidateSet('System','User')][string]$UserType,
        [Parameter(Mandatory=$true)][ValidateSet('Path','PSModulePath')][string]$PathType
    )

    # AddTo-Path "C:\XXX" "PSModulePath" 'System' 
    if ($UserType -eq "System" ) { $RegPropertyLocation = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' }
    if ($UserType -eq "User"   ) { $RegPropertyLocation = 'HKCU:\Environment' } # also note: Registry::HKEY_LOCAL_MACHINE\ format
    $PathOld = (Get-ItemProperty -Path $RegPropertyLocation -Name $PathType).$PathType
    "`n$UserType $PathType Before:`n$PathOld`n"
    $PathArray = $PathOld -Split ";" -replace "\\+$", ""
    if ($PathArray -notcontains $PathToAdd) {
        "$UserType $PathType Now:"   # ; sleep -Milliseconds 100   # Might need pause to prevent text being after Path output(!)
        $PathNew = "$PathOld;$PathToAdd"
        Set-ItemProperty -Path $RegPropertyLocation -Name $PathType -Value $PathNew
        Get-ItemProperty -Path $RegPropertyLocation -Name $PathType | select -ExpandProperty $PathType
        if ($PathType -eq "Path") { $env:Path += ";$PathToAdd" }                  # Add to Path also for this current session
        if ($PathType -eq "PSModulePath") { $env:PSModulePath += ";$PathToAdd" }  # Add to PSModulePath also for this current session
        "`n$PathToAdd has been added to the $UserType $PathType"
    }
    else {
        "'$PathToAdd' is already in the $UserType $PathType. Nothing to do."
    }
}

# Add "C:\XXX" to User Path (but only if not already present)
AddTo-Path "C:\XXX" "User" "Path"

# Just show the current status by putting an empty path
AddTo-Path "" "User" "Path"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.