Mengatur variabel lingkungan Windows PowerShell

608

Saya telah menemukan bahwa pengaturan variabel lingkungan PATH hanya memengaruhi prompt perintah lama. PowerShell tampaknya memiliki pengaturan lingkungan yang berbeda. Bagaimana cara mengubah variabel lingkungan untuk PowerShell (v1)?

catatan:

Saya ingin membuat perubahan saya permanen, jadi saya tidak perlu mengaturnya setiap kali saya menjalankan PowerShell. Apakah PowerShell memiliki file profil? Sesuatu seperti profil Bash di Unix?

Vasil
sumber
1
Saya ingin memiliki profil pusat yang terletak di berbagi file. Sinkronisasi itu menyakitkan. Membuat profil rintisan dengan. \\ computer \ share \ path \ Profile.ps1 tampaknya seperti kludge (coba Notepad $ Profile). Alangkah baiknya jika ada cara untuk mengubah variabel otomatis $ Profile secara permanen.
Nathan Hartley
5
Tidak, lingkungan PATH juga memengaruhi prompt perintah PowerShell. Yang berbeda adalah PowerShell tidak menerima jalur yang dilampirkan dalam tanda kutip. Solusi: hapus semua tanda kutip terlampir ( ") dalam variabel lingkungan path
Nilzor
3
JIKA ANDA BERADA DI SINI UNTUK PS> v1 ... Lebih lanjut ke komentar Nilzor di atas: Gunakan ini untuk menghapus semua "dari jalur dalam variabel lingkungan PATH untuk sesi Anda:$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
d3r3kk

Jawaban:

479

Mengubah variabel lingkungan aktual dapat dilakukan dengan menggunakan env: namespace / driveinformasi. Misalnya, kode ini akan memperbarui variabel lingkungan jalur:

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

Ada beberapa cara untuk membuat pengaturan lingkungan permanen, tetapi jika Anda hanya menggunakannya dari PowerShell, mungkin jauh lebih baik menggunakan profil Anda untuk memulai pengaturan. Saat startup, PowerShell akan menjalankan file .ps1 yang ditemukannya di WindowsPowerShelldirektori di bawah folder My Documents. Biasanya Anda memiliki file profile.ps1 sudah ada di sana. Path di komputer saya adalah

C:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1
JaredPar
sumber
38
$ profile adalah variabel otomatis yang menunjuk pada profil pengguna Anda untuk semua host PowerShell.
JasonMArcher
16
Perhatikan bahwa (split-path $ profile) (untuk mendapatkan folder yang berisi) dapat berisi banyak file profil: profile.ps1 harus dimuat oleh semua host, <host-name> _profile.ps1 hanya oleh host yang ditentukan. Untuk PowerShell.exe (host konsol), ini adalah Microsoft.PowerShell_profile.ps1.
Richard
10
Bagaimana jika saya tidak memiliki folder WindowsPowerShell di dokumen saya? Haruskah saya membuat folder dan file? Apa yang harus saya masukkan ke file jika saya ingin menambahkan C:\path\to\file.extvariabel lingkungan? EDIT: sudah menemukannya. Jawabannya adalah ya, buat itu. File harus terdiri dari 1 baris: $env:path += ;C:\path\to\file.ext".
Lewistrick
7
@Lewistrick Anda tidak memiliki profil secara default. Saya mengikuti petunjuk ini untuk membuatnya: howtogeek.com/50236/customizing-your-powershell-profile
MikeB
16
Berhati-hatilah dalam melakukan ini - itu akan menghancurkan jalan Anda saat ini. $env:Path = "SomeRandomPath"; Sebagai gantinya - lihat @mloskot, di bawah.
John Mark
626

Jika, beberapa saat selama sesi PowerShell, Anda perlu menambahkan variabel lingkungan PATH untuk sementara, Anda dapat melakukannya dengan cara ini:

$env:Path += ";C:\Program Files\GnuWin32\bin"
mloskot
sumber
4
+1 :: Baris satu ini cukup efektif untuk doa berbasis sesi seperti dengan ... IE $ env: PATH + = "; c: \ MinGW \ msys \ 1.0 \ bin" ^ {some mingw bin ... }
Eddie B
2
dan bagaimana cara menghapus jalur?
becko
11
Jika Anda perlu jalur Anda dipanggil sebelum jalur standar, masukkan di awal $env:Path = "C:\MyPath;$env:Path"
Michael Freidgeim
4
**** Jangan lupa titik koma di awal string tambahan, seperti yang terlihat di komentar @Kevin. Ini cukup jelas, tetapi dapat dilewatkan jika Anda cukup menyalin / menempelkan kode dalam jawaban dan tidak memiliki titik koma di akhir jalur yang ada. Saya akan mencoba mengirimkan hasil edit.
Matt Goodrich
1
@MattGoodrich Saya sudah mengembalikan ke revisi sebelumnya
Cœur
278

Anda juga dapat memodifikasi variabel lingkungan pengguna / sistem secara permanen (yaitu akan bertahan di seluruh shell restart) dengan yang berikut ini:

Ubah variabel lingkungan sistem

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

Ubah variabel lingkungan pengguna

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

Penggunaan dari komentar - tambahkan ke variabel lingkungan sistem

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

Solusi berbasis string juga dimungkinkan jika Anda tidak ingin menulis tipe

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")
hoge
sumber
6
Ini sangat berguna untuk sistem akses terbatas.
h0tw1r3
14
@AndresRiofrio, Ya, ini permanen. Penggunaan: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) Anda tidak akan melihat hasil dari perubahan ini sampai Anda memulai sesi PowerShell baru. Yaitu, jika Anda memeriksa $ env: Path segera setelah menjalankan perintah ini, Anda akan melihat apa $ env: Path sebelum perintah. Untuk memperbarui, tutup dan buka shell atau memulai sesi baru.
FLGMwt
7
@ FLGMwt Anda memiliki kesalahan ketik, yang benar adalah: [Lingkungan] :: SetEnvironmentVariable ("Path", $ env: Path + "; C: \ bin", [EnvironmentVariableTarget] :: Machine)
antusias1tanggal
10
Anda dapat menulis string "Mesin" atau "Pengguna" alih-alih keseluruhan .NET enum. Dari Technet .
bouvierr
3
Saya pikir jawaban itu juga harus menunjukkan penggunaan untuk mengatur variabel pengguna, seperti ini[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Saito
63

Dari prompt PowerShell:

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

Anda kemudian akan melihat teks:

SUCCESS: Specified value was saved.

Mulai ulang sesi Anda, dan variabel akan tersedia. setxjuga bisa digunakan untuk mengatur variabel arbitrer. Ketik setx /?pada prompt untuk dokumentasi.

Sebelum mengacaukan lintasan Anda dengan cara ini, pastikan Anda menyimpan salinan lintasan yang ada dengan melakukannya $env:path >> a.outdi prompt PowerShell.

tjb
sumber
5
Tampaknya hanya berfungsi ketika 'berjalan sebagai administrator', dan setelah itu berlaku hanya untuk 'berjalan sebagai administrator' konsol PowerShell, tidak secara teratur menjalankan yang.
matanster
1
Berikut ini beberapa dokumentasi resmi Microsoft untuk Setx .
12
Aduh - baru saja terkena batas karakter 1024 setx; untungnya saya mengikuti saran untuk mencatat nilai $ end yang ada: Path. Hanya sesuatu yang perlu diperhatikan: superuser.com/questions/387619/…
Jonno
3
Mengapa tidak disetel $env:PATHterlebih dahulu, lalu setx /m PATH "$env:PATH"diterapkan secara lokal dan global tanpa shell restart?
tresf
1
Bagus! Meskipun setx bukan cmdlet asli, masih merupakan alternatif yang jauh lebih baik dan mudah dilupakan dibandingkan dengan panggilan .NET Framework panggilan lama yang menjengkelkan! Sungguh membingungkan bahwa bahkan Powershell 7 masih tidak datang dengan cmdlet resmi untuk tetap bertahan meskipun. Apa. Terasa seperti fitur yang harus setara dengan 'ls'.
Jonas
27

Seperti jawaban JeanT , saya ingin abstraksi untuk menambahkan jalan. Tidak seperti jawaban JeanT, saya membutuhkannya untuk berjalan tanpa interaksi pengguna. Perilaku lain yang saya cari:

  • Pembaruan $env:Pathsehingga perubahan berlaku di sesi saat ini
  • Tetap melakukan perubahan variabel lingkungan untuk sesi mendatang
  • Tidak menambahkan jalur duplikat ketika jalur yang sama sudah ada

Dalam hal ini berguna, ini dia:

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

Lihat intisari saya untuk Remove-EnvPathfungsi yang sesuai .

Michael Kropat
sumber
16

Meskipun jawaban yang diterima saat ini berfungsi dalam arti bahwa variabel path akan diperbarui secara permanen dari konteks PowerShell, itu tidak benar-benar memperbarui variabel lingkungan yang disimpan dalam registri Windows.

Untuk mencapai itu, Anda jelas dapat menggunakan PowerShell juga:

$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

Informasi lebih lanjut ada di posting blog Gunakan PowerShell untuk Memodifikasi Path Lingkungan Anda

Jika Anda menggunakan ekstensi komunitas PowerShell, perintah yang tepat untuk menambahkan jalur ke jalur variabel lingkungan adalah:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine
gijswijs
sumber
12

Semua jawaban yang menyarankan perubahan permanen memiliki masalah yang sama: Mereka memecahkan nilai registri jalur.

SetEnvironmentVariablemengubah REG_EXPAND_SZnilai %SystemRoot%\system32 menjadi REG_SZnilai C:\Windows\system32.

Variabel lain di jalur juga hilang. Menambahkan yang baru menggunakan %myNewPath%tidak akan bekerja lagi.

Berikut ini skrip Set-PathVariable.ps1yang saya gunakan untuk mengatasi masalah ini:

 [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
 }

Saya menjelaskan masalahnya secara lebih rinci dalam posting blog .

Peter Hahndorf
sumber
Haruskah ini: $ newPath = $ newPath -replace ";;", ";" ?
Joe Johnston
8

Ini menetapkan jalur untuk sesi saat ini dan meminta pengguna untuk menambahkannya secara permanen:

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

Anda dapat menambahkan fungsi ini ke profil default Anda, ( Microsoft.PowerShell_profile.ps1), biasanya terletak di %USERPROFILE%\Documents\WindowsPowerShell.

JeanT
sumber
6

Membangun jawaban @Michael Kropat, saya menambahkan parameter untuk menambahkan path baru ke PATHvariabel yang ada dan memeriksa untuk menghindari penambahan path yang tidak ada:

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 ';'
            }
        }
    }
}
SBF
sumber
5

Seperti yang disebutkan oleh Jonathan Leaders di sini , penting untuk menjalankan perintah / skrip yang ditinggikan untuk dapat mengubah variabel lingkungan untuk 'mesin' , tetapi menjalankan beberapa perintah yang ditinggikan tidak harus dilakukan dengan Ekstensi Komunitas, jadi saya ingin untuk memodifikasi dan memperluas jawaban JeanT dengan suatu cara, bahwa mengubah variabel mesin juga dapat dilakukan bahkan jika skrip itu sendiri tidak dijalankan dengan peningkatan:

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
    }

}
Mehrdad Mirreza
sumber
5

Sebagian besar jawaban tidak membahas UAC . Ini mencakup masalah UAC.

Pertama instal Ekstensi Komunitas PowerShell: choco install pscxvia http://chocolatey.org/ (Anda mungkin harus memulai ulang lingkungan shell Anda).

Kemudian aktifkan pscx

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

Kemudian gunakan Invoke-Elevated

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

Saran saya adalah ini:

Saya telah menguji ini untuk menambah C:\oracle\x64\binvariabel lingkungan Pathsecara permanen dan ini berfungsi dengan baik.

$ENV:PATH

Cara pertama adalah melakukan:

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

Tetapi perubahan ini tidak permanen. $env:pathakan kembali ke keadaan semula begitu Anda menutup terminal PowerShell Anda dan membukanya kembali. Itu karena Anda telah menerapkan perubahan di tingkat sesi dan bukan di tingkat sumber (yang merupakan tingkat registri). Untuk melihat nilai global $env:path, lakukan:

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

Atau lebih khusus:

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

Sekarang untuk mengubah ini, pertama-tama kita tangkap jalur asli yang perlu dimodifikasi:

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

Sekarang kita mendefinisikan seperti apa jalan baru itu. Dalam hal ini kami menambahkan folder baru:

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

Catatan: Pastikan $newpathtampilannya seperti yang Anda inginkan. Jika tidak, maka Anda dapat merusak OS Anda.

Sekarang terapkan nilai baru:

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

Sekarang lakukan satu pemeriksaan terakhir yang terlihat seperti yang Anda harapkan:

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

Anda sekarang dapat me-restart terminal PowerShell Anda (atau bahkan me-reboot mesin) dan melihat bahwa itu tidak mundur ke nilai lamanya lagi.

Perhatikan bahwa urutan jalur dapat berubah sehingga sesuai urutan abjad, jadi pastikan Anda memeriksa seluruh baris. Untuk membuatnya lebih mudah, Anda dapat membagi output menjadi baris dengan menggunakan titik koma sebagai pembatas:

($env:path).split(“;”)
ali Darabi
sumber
3

Buka PowerShell dan jalankan:

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

Di dalam PowerShell, seseorang dapat menavigasi ke direktori variabel lingkungan dengan mengetik:

Set-Location Env:

Ini akan membawa Anda ke direktori Env:>. Dari dalam direktori ini:

Untuk melihat semua variabel lingkungan, ketik:

Env:\> Get-ChildItem

Untuk melihat variabel lingkungan tertentu, ketik:

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

Untuk mengatur variabel lingkungan, ketik:

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

Untuk menghapus variabel lingkungan, ketik:

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

Informasi lebih lanjut ada di About Variabel Lingkungan .

Paul Maurer
sumber
0

Saya mencoba sedikit mengoptimalkan kode SBF dan Michael untuk membuatnya lebih ringkas.

Saya mengandalkan paksaan tipe PowerShell di mana secara otomatis mengubah string menjadi nilai enum, jadi saya tidak mendefinisikan kamus pencarian.

Saya juga menarik keluar blok yang menambahkan jalur baru ke daftar berdasarkan kondisi, sehingga pekerjaan dilakukan sekali dan disimpan dalam variabel untuk digunakan kembali.

Ini kemudian diterapkan secara permanen atau hanya untuk Sesi tergantung pada $PathContainerparameter.

Kita bisa meletakkan blok kode dalam suatu fungsi atau file ps1 yang kita panggil langsung dari command prompt. Saya pergi dengan 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;

Saya melakukan sesuatu yang serupa untuk 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;

Sejauh ini, mereka tampaknya berhasil.

Eniola
sumber
0

Hanya jawaban yang mendorong nilai ke dalam registri yang memengaruhi perubahan permanen (sehingga sebagian besar jawaban di utas ini, termasuk jawaban yang diterima, tidak memengaruhi secara permanen Path).

Fungsi berikut berfungsi untuk Path/ PSModulePathdan untuk User/ Systemjenis. Ini juga akan menambahkan jalur baru ke sesi saat ini secara default.

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"
YorSubs
sumber