2012-01-23 9 views
5

मैं पावरशेल में कई W2k3 सर्वरों पर खाली स्थान के साथ अपने 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) 

उन्हें चलाने के बाद, पथ तरीके मैं इरादा नहीं था में बदल गई है: कई regex परिवर्तनों के बाद, मैं निम्नलिखित दो आदेशों को चलाने के। % SystemRoot% समान रूप से C: \ Windows में विस्तारित है। मैं नहीं देख सकता कि यह सर्वनाश को कहां सिग्नल करता है, लेकिन मैं% SystemRoot% को रखना चाहता हूं, इसलिए जब तक मुझे पथ में% SystemRoot% दिखाई नहीं देता तब तक मैं झुका हुआ था, लेकिन जब मैं पथ नहीं करता तो अब विस्तार नहीं करता है और अब नहीं काम करता है। सीएलआई पर पथ को प्रतिबिंबित करने से एक अनपेक्षित स्ट्रिंग (यह गलत है) और सिस्टम रूट में कमांड नहीं मिल सकते हैं।

यदि मैं पाथ में किसी भी अन्य पाठ को बदलने के बिना पथ ";;" में एक शून्य प्रविष्टि जोड़ता हूं, तो यह सही तरीके से काम करना शुरू कर देता है।

तो मेरा सवाल यह है कि पावरशेल का उपयोग करके प्रोग्रामेटिक रूप से पथ को कैसे बदला जाए ताकि पथ के भीतर परिवर्तनीय विस्तार को अपनाना न पड़े?

+0

2 नोट्स: 1) मैं प्रत्येक परीक्षण के लिए एक नया सीएलआई खोलता हूं, और 2) जिस पथ को मैं $ env से पढ़ता हूं: पथ बढ़ाया जाता है, इसलिए मैं c: \ windows पढ़ रहा हूं और मैन्युअल रूप से% SystemRoot को बदल रहा हूं % फिर उस मान को पर्यावरण पर वापस धक्का दे रहा है। – codepoke

+0

जब आप इसे 'पथ' पर सेट कर रहे हैं तो '$ पथ' में क्या है? – manojlds

+0

यह प्रत्येक सर्वर पर अलग है, लेकिन ...;% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0; ... सभी पर एक घटक है उनमें से। जब मैं $ पथ पढ़ता हूं, तो इसे पढ़ने की प्रक्रिया के दौरान c: \ Windows में विस्तारित किया जाता है। मुझे इसे विस्तारित करने के पहले विस्तारित मान को इसके परिवर्तनीय समकक्ष के साथ-साथ स्थानांतरित करना होगा। वैरिएबल के साथ वह $ पथ मान तब तक विस्तारित नहीं होगा जब तक कि मैं इसे गुण संवाद के माध्यम से मैन्युअल रूप से स्पर्श नहीं करता। – codepoke

उत्तर

6

जहाँ तक मैं कह सकता हूं, आप इसे [Environment]::SetEnvironmentVariable() विधि से नहीं कर सकते हैं और आप रजिस्ट्री प्रदाता के साथ ऐसा नहीं कर सकते हैं। लेकिन अगर आप रजिस्ट्री में सिस्टम पथ env var पहुंचने देता है ताकि तरह Microsoft.Win32.RegistryKey वर्ग का उपयोग कर सकते हैं:

 
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

शानदार, कीथ। फिर से धन्यवाद। – codepoke

+0

एफवाईआई, स्क्रिप्ट को शायद कोशिश/अंत में रखा जाना चाहिए और अंत में रजिस्ट्री कुंजी पर एक निपटान करें। –

+0

आप जानते हैं, मैंने इसके बारे में लगभग पूछा है, लेकिन चूंकि मेरी स्क्रिप्ट कम है और प्रत्येक चर तुरंत चला जाता है, मैंने इसे पसीना नहीं दिया। लेकिन जब से आप इसे लाया। :-) .NET 4.0 में मैन्युअल डिसपोज़() विधि शामिल है जिसे आप कॉल करते हैं, लेकिन 2.0 नहीं है। निपटान() विधि के बिना मुझे कुंजी का निपटान कैसे करना चाहिए? – codepoke

संबंधित मुद्दे