it-swarm.dev

أعد تحميل المسار في PowerShell

إذا كان لدي مثيل من PowerShell ISE قيد التشغيل وقمت بتثبيت شيء يعدل PATH أو أقوم بتعديله بأي طريقة خارج PowerShell ، فأنا بحاجة إلى إعادة تشغيل PowerShell حتى ترى متغير PATH المحدث.

هل هناك طريقة لإعادة تحميل المسار من داخل PowerShell دون إعادة تشغيله؟

107
rob

فقط لإظهار تعليق Rob إلى النور:

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
138
mpen

حاول الحصول على مسار الجهاز وتعيينه إلى مسار الجلسة.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
67
Shay Levy

أسهل طريقة ، استخدم Chocolatey (مجانية). إنه يعمل مع كل من CMD و PowerShell. ستتمكن بعد ذلك من إعادة تحميل PATH (مع توسع متغير) باستخدام أمر بسيط:

refreshenv

التثبيت من cmd (يتطلب حقوق المسؤول):

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

مثال للاستخدام:

> SET Java_HOME=c:/Java/jdk6
> SET PATH=%Java_HOME%/bin
> ECHO %PATH%
c:/Java/jdk6/bin

> SET Java_HOME=c:/Java/jdk8
> refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
> echo %PATH%
c:/Java/jdk8/bin
10
Arkadiusz Przechodzki

بناءً على إجابة mpen ، إليك وظيفة PowerShell:

function refresh-path {
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
                ";" +
                [System.Environment]::GetEnvironmentVariable("Path","User")
}

ثم فقط اتصل بـ refresh-path.

3
Tjaart

إذا كان المسار الخاص بك يحتوي على متغيرات البيئة التي لم يتم تعريفها في بداية الجلسة ، فأنت تريد توسيعها أيضًا:

$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))

بالنسبة لي ، كان هذا مفيدًا بعد تثبيت NVM الذي يحدد ويضيف٪ NVM_HOME٪ إلى المسار.

لنقل هذا إلى نهايته المنطقية ، يمكنك استخدام هذه الدالة العودية للتوسع بدلاً من ذلك:

function Expand-EnvironmentVariablesRecursively($unexpanded) {
    $previous = ''
    $expanded = $unexpanded
    while($previous -ne $expanded) {
        $previous = $expanded
        $expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
    }
    return $expanded
}

ثم استخدم:

$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))

لقد فتحت مشكلة لإضافة هذا الحل إلى refreshenv من Chocolatey.

1
Graham

فقط للإضافة إلى الإجابات الأخرى ، يمكنك التأكد من أنك لا تضيف روابط غير ضرورية عن طريق التصفية في حال كان لدى المستخدم مسار فارغ.

$env:Path=(
    [System.Environment]::GetEnvironmentVariable("Path","Machine"),
    [System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'

أو ، بشكل أكثر فائدة ، إذا كنت تقوم بتشغيل برنامج نصي يضيف إلى متغيرات بيئة مختلفة أو متعددة ، فاستخدم دالة لإعادة تعيينها جميعًا

function resetEnv {
    Set-Item `
        -Path (('Env:', $args[0]) -join '') `
        -Value ((
            [System.Environment]::GetEnvironmentVariable($args[0], "Machine"),
            [System.Environment]::GetEnvironmentVariable($args[0], "User")
        ) -match '.' -join ';')
}
resetEnv Path
resetEnv AppPath
0
Hashbrown