यदि आप मूल एप्लिकेशन कॉल कर रहे हैं, तो आपको [Environment]::CurrentDirectoryPowerShell की $PWDवर्तमान निर्देशिका के बारे में चिंता करने की आवश्यकता है । विभिन्न कारणों से, जब आप सेट-लोकेशन या पुश-लोकेशन करते हैं, तो पावरशेल प्रक्रिया की वर्तमान वर्किंग डायरेक्टरी को सेट नहीं करता है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि यदि आप एप्लिकेशन (या cmdlets) चला रहे हैं तो यह सेट होने की उम्मीद है।
एक स्क्रिप्ट में, आप यह कर सकते हैं:
$CWD = [Environment]::CurrentDirectory
Push-Location $MyInvocation.MyCommand.Path
[Environment]::CurrentDirectory = $PWD
## Your script code calling a native executable
Pop-Location
# Consider whether you really want to set it back:
# What if another runspace has set it in-between calls?
[Environment]::CurrentDirectory = $CWD
इसका कोई मूर्खतापूर्ण विकल्प नहीं है। हम में से कई लोग [पर्यावरण] :: CurrentDirectory ... को सेट करने के लिए हमारे प्रॉम्प्ट फ़ंक्शन में एक लाइन डालते हैं ... लेकिन यह तब आपकी मदद नहीं करता है जब आप किसी स्क्रिप्ट के भीतर स्थान बदल रहे होते हैं ।
कारण के बारे में दो नोट क्यों यह PowerShell द्वारा स्वचालित रूप से सेट नहीं किया गया है:
- PowerShell को बहु-थ्रेड किया जा सकता है। आपके पास एक एकल प्रक्रिया में एक साथ कई रनस्पेस (रनस्पेसपूल और PSThreadJob मॉड्यूल देखें) हो सकते हैं। प्रत्येक रनस्पेस की अपनी
$PWDवर्तमान कार्यशील निर्देशिका है, लेकिन केवल एक प्रक्रिया है, और केवल एक पर्यावरण है।
- यहां तक कि जब आप सिंगल-थ्रेडेड होते हैं,
$PWDतो हमेशा एक कानूनी करंटडायरेक्टरी (आप उदाहरण के लिए रजिस्ट्री प्रदाता में सीडी कर सकते हैं) नहीं है।
यदि आप इसे अपने प्रॉम्प्ट में डालना चाहते हैं (जो केवल मुख्य रनवे, सिंगल-थ्रेडेड में चलेगा), तो आपको उपयोग करने की आवश्यकता है:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
antकुछ मापदंडों के साथ कॉल करती है । इसलिए मुझेantयह सुनिश्चित करने के लिए उस फ़ोल्डर से कॉल करना होगा कि यह कॉन्फ़िगरेशन फ़ाइल को सही ढंग से ढूंढता है। आदर्श रूप से मैं उस स्क्रिप्ट के भीतर स्थानीय रूप से निष्पादन निर्देशिका को अस्थायी रूप से बदलने के लिए कुछ ढूंढ रहा हूं।