usando o powershell para atualizar o caminho do sistema não funciona imediatamente?

1

Estou tentando usar o powershell para atualizar o caminho do sistema Windows:

$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   

parece funcionar, Get-ItemProperty não mostra "C: \ nuget" é adicionado no caminho. O problema é então eu iniciar um novo console PowerShell ou um console de linha de comando e digite "nuget", eu ainda recebo "O termo 'nuget' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável"

no novo console do powershell, se eu executar novamente o Get-ItemProperty, ele mostrará que o novo Path está lá, simplesmente não entrará em vigor imediatamente na sessão atual do usuário. Se eu executar "set" no console do cmd, o novo caminho não estará lá na variável PATH.

BTW, depois que o Set-ItemProperty foi executado, verifiquei o painel de controle - > Sistema > Configuração do sistema avançado > Variáveis de ambiente, o novo caminho que adicionei está lá.

Descobri que se eu modificar manualmente a configuração do sistema Path through Windows, ela entrará em vigor imediatamente (o novo cmd / powershell terá isso); mas se o caminho for modificado pelo comando set-ItemProperty do powershell, então eu tenho que fazer logoff, então login, então o novo Path terá efeito.

Parece que o caminho do sistema está em cache na sessão de login do usuário atual.

    
por jack.chen.job 27.09.2017 / 21:28

2 respostas

2

Quando você altera a variável PATH usando o painel de controle, quando clica em "OK", o painel de controle envia uma mensagem WM_SETTINGCHANGE para todas as janelas abertas, para que eles saibam que as variáveis do ambiente foram alteradas.

Portanto, se você não quiser fazer logoff, você deve enviar WM_SETTINGCHANGE você mesmo criando / encontrando um pequeno programa que envie esta mensagem de acordo com a documentação: link

    
por 30.09.2017 / 20:33
0

Só quero postar uma resposta completa em link , seguindo script de powershell vai fazer o truque:

    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);

    
por 04.10.2017 / 14:59