fragen stichworte

das Aktualisieren des Systempfads mit Powershell funktioniert nicht sofort?

Ich versuche, Powershell zum Aktualisieren des Windows-Systempfads zu verwenden:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path
$newpath = "$oldpath;C:\nuget"
Write-Output "PATH:$newpath"
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -Force
Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH   

Es scheint gut zu funktionieren, Get-ItemProperty zeigt an, dass "C: \ nuget" in den Pfad eingefügt wurde. Das Problem ist, dann starte ich eine neue Powershell-Konsole oder eine Befehlszeilenkonsole und tippe "nuget". Ich bekomme immer noch "Der Begriff" nuget "wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt."

Wenn Sie in der neuen Powershell-Konsole Get-ItemProperty erneut ausführen, wird angezeigt, dass der neue Pfad vorhanden ist. Er wird in der aktuellen Benutzersitzung nicht sofort wirksam. Wenn ich "set" in cmd console ausführte, war der neue Pfad in der PATH-Variable nicht vorhanden.

Übrigens, nachdem Set-ItemProperty ausgeführt wurde, überprüfte ich Control Pannel-> System-> Advanced System Setting-> Umgebungsvariablen. Der neue Pfad, den ich hinzugefügt habe, ist da.

Ich habe festgestellt, dass der Pfad durch Windows-Systemeinstellungen manuell geändert wird. Er wird sofort wirksam (neue Cmd/Powershell wird es haben). Wenn der Pfad jedoch vom Powershell-Befehl Set-ItemProperty geändert wird, muss ich mich abmelden und dann anmelden. Dann wird der neue Pfad wirksam.

Fühlt sich an, als würde der Systempfad in der aktuellen Benutzeranmeldesitzung zwischengespeichert.

antworten

Wenn Sie die PATH-Variable über die Systemsteuerung ändern, wenn Sie auf "OK" klicken, sendet die Systemsteuerung eine WM_SETTINGCHANGE-Nachricht an alle geöffneten Fenster, damit sie wissen, dass die Umgebungsvariablen geändert wurden.

Wenn Sie sich also nicht abmelden möchten, müssen Sie WM_SETTINGCHANGE selbst senden, indem Sie ein kleines Programm erstellen/finden, das diese Nachricht gemäß der Dokumentation sendet: https://msdn.microsoft.com/de- us/library/windows/desktop/ms725497% 28v = vs.85% 29.aspx? f = 255 & amp; MSPPError = -2147217396

Ich möchte nur eine vollständige Antwort von https://mnaoumov.wordpress.com/2012/07/24/powershell-add-directory-to-environment-path-variable/ veröffentlichen Das folgende Powershell-Skript führt den folgenden Trick aus:

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

    $HWND_BROADCAST = [IntPtr] 0xffff;
    $WM_SETTINGCHANGE = 0x1a;
    $result = [UIntPtr]::Zero

    if (-not ("Win32.NativeMethods" -as [Type]))
    {
        # import sendmessagetimeout from win32
        Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessageTimeout(
        IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
        uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
    }
    # notify all windows of environment block change
    [Win32.Nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref] $result);