2012-01-23 7 views
5

Sto modificando il PATH su diversi server W2k3 in PowerShell per convertire determinati percorsi con spazi vuoti ai loro equivalenti 8.3. Dopo diverse trasformazioni regex, corro i seguenti due comandi:Come si gestisce l'espansione della variabile PATH di Windows quando impostata da PowerShell?

# Set the path for this process 
$env:PATH = $path 
# Set the path for the Machine 
[System.Environment]::SetEnvironmentVariable('PATH', $path,[System.EnvironmentVariableTarget]::Machine) 

Dopo di loro esecuzione, il percorso è cambiato in modi che non ho intenzione. % SystemRoot% viene espanso uniformemente in C: \ Windows. Non riesco a vedere dove questo segnali l'apocalisse, ma preferirei mantenere% SystemRoot%, quindi mi sono divertito fino a quando non ho ottenuto% SystemRoot% per comparire nuovamente nel percorso, ma quando eseguo il percorso non si espande più e non è più lavori. L'eco del percorso in CLI restituisce una stringa non estesa (questo è errato) e i comandi nel SystemRoot non possono più essere trovati.

Se poi aggiungo una voce nulla al percorso ";;", senza alterare alcun altro testo nel PERCORSO, inizia a funzionare correttamente.

Quindi la mia domanda è come modificare il percorso in modo programmatico utilizzando PowerShell in modo da non compromettere l'espansione delle variabili all'interno del percorso?

+0

2 note: 1) apro una nuova CLI per ciascun test e 2) il percorso che ho letto da $ env: PATH è espanso, quindi sto leggendo c: \ windows e modificando manualmente il valore su% SystemRoot % quindi spingere quel valore verso l'ambiente. – codepoke

+0

Cosa c'è in '$ path' quando lo si imposta su' PATH'? – manojlds

+0

È diverso su ogni server, ma ...;% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0; ... è un componente su tutti di loro. Quando leggo $ path, viene esteso a c: \ Windows durante i processi di lettura. Devo -ire il valore espanso con il suo equivalente variabile prima di impostarlo. Il valore del percorso $ con le variabili non si espande di nuovo a meno che non lo tocchi manualmente attraverso la finestra di dialogo delle proprietà. – codepoke

risposta

6

Per quanto posso dire, non è possibile farlo con il metodo [Environment]::SetEnvironmentVariable() e non è possibile farlo con il provider del Registro di sistema. Tuttavia è possibile accedere al sistema di env var percorso nel Registro di sistema utilizzando la classe Microsoft.Win32.RegistryKey in questo modo:

 
C:\PS> $key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment', $true) 
C:\PS> $path = $key.GetValue('Path',$null,'DoNotExpandEnvironmentNames') 
C:\PS> $path 
...;%systemroot%\System32\WindowsPowerShell\v1.0\ 
C:\PS> $key.SetValue('Path', $path + ';%Windir%\Symbols', 'ExpandString') 
C:\PS> $key.Dispose() 

Questo vi permetterà di salvare il PATH aggiornato e conservare le variabili che compaiono nel valore di percorso.

+0

Favoloso, Keith. Grazie ancora. – codepoke

+0

FYI, lo script dovrebbe probabilmente essere messo in un try/finally e all'interno infine fare un Dispose sulla chiave di registro. –

+0

Sai, ho quasi chiesto di questo, ma dal momento che il mio copione è breve e ogni variabile scompare immediatamente, non l'ho sudato. Ma da quando lo hai inventato. :-) .NET 4.0 include il metodo Dispose() manuale che chiami, ma 2.0 no. Come devo smaltire la chiave senza un metodo Dispose()? – codepoke

Problemi correlati