2012-01-23 3 views
5

PowerShell의 여러 W2k3 서버에서 PATH를 조정하여 공백이있는 특정 경로를 8.3 등가로 변환합니다. 몇 가지 정규식 변환 후 다음 두 명령을 실행합니다.PowerShell에서 설정할 때 Windows PATH 변수 확장을 처리하는 방법은 무엇입니까?

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

실행 후, 의도하지 않은 방식으로 경로가 변경됩니다. % SystemRoot %는 C : \ Windows로 균일하게 확장됩니다. 이 신호가 종말을 알리는 곳을 볼 수는 없지만 % SystemRoot %를 유지하고 싶습니다. 그래서 % SystemRoot %가 경로에 다시 나타날 때까지 만져 보았습니다. 그러나 경로를 더 이상 확장하지 않고 더 이상 확장하지 않습니다. 공장. CLI에서 경로를 에코하면 확장되지 않은 문자열이 반환되고 (잘못된 경우) SystemRoot의 명령을 더 이상 찾을 수 없습니다.

"PATH에 다른 텍스트를 변경하지 않고";; "경로에 Null 항목을 추가하면 제대로 작동하기 시작합니다.

그래서 내 질문에 패스 내에서 변수 확장을하지 않으려면 프로그래밍 방식으로 PowerShell을 사용하여 경로를 변경하는 방법입니까?

+0

2 노트 : 1) 각 테스트마다 새로운 CLI를 열고 2) $ env에서 읽은 경로 : PATH가 확장되어 c : \ windows를 읽고 % SystemRoot로 값을 수동으로 변경합니다. 그런 다음 해당 값을 다시 환경으로 푸시합니다. – codepoke

+0

'$ path'에'PATH'를 설정하면 무엇입니까? – manojlds

+0

모든 서버마다 다르지만 ..., % SystemRoot % \ system32, % SystemRoot %, % SystemRoot % \ System32 \ Wbem, % SystemRoot % \ system32 \ WindowsPowerShell \ v1.0; 그들의. $ path를 읽으면 읽기 프로세스 중에 c : \ Windows로 확장됩니다. 설정하기 전에 변수 값으로 확장 된 값을 다시 써야합니다. 변수가있는 $ path 값은 속성 대화 상자를 통해 수동으로 터치하지 않으면 다시 확장되지 않습니다. – codepoke

답변

6

내가 알 수있는 한 [Environment]::SetEnvironmentVariable() 메서드를 사용하여이 작업을 수행 할 수 없으며 레지스트리 공급자에게이 작업을 수행 할 수 없습니다. 당신이 그렇게 같은 Microsoft.Win32.RegistryKey 클래스를 사용하여 레지스트리에서 시스템 경로 ENV var에 액세스 할 수 있습니다 그러나 :

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

이 업데이트 된 경로를 저장하고 경로 값에 표시되는 변수를 보존 할 수 있습니다.

+0

Fabulous, Keith. 다시 감사합니다. – codepoke

+0

참고로, 스크립트는 try/finally에 넣고 마침내 레지스트리 키에 Dispose를 수행해야합니다. –

+0

알다시피, 나는 거의 이것에 대해 물어 보았습니다. 그러나 스크립트가 짧고 모든 변수가 즉시 사라지기 때문에 나는 그것을 땀을 흘리지 않았습니다. 하지만 네가 그것을 키운 이후로. :-) .NET 4.0에는 사용자가 호출하는 수동 Dispose() 메서드가 있지만 2.0은 포함하지 않습니다. Dispose() 메서드없이 키를 처리하려면 어떻게해야합니까? – codepoke

관련 문제