दिलचस्प पोस्ट
जब मैं os.system () या subprocess.call () का उपयोग करता हूं, तो मैं कंसोल कैसे छुपूं? टैबलायआउट के साथ एक टुकड़ा में कार्डविएव पंक्तियों के साथ रीसाइक्लेअर दृश्य को कैसे लागू किया जाए एंड्रॉइड पार्सलेट योग्य – रिटेलरऑर्डर एक्टिविटी.जावा रिटर्न नल सी: एकाधिक scanf है, जब मैं एक scanf के लिए एक मूल्य दर्ज करते हैं यह दूसरे scanf छोड़ता है java: यह क्या है: [Ljava.lang.Object ;? INOTifyPropertyChanged को कार्यान्वित करना – क्या एक बेहतर तरीका मौजूद है? जावास्क्रिप्ट में वर्तमान दिनांक और समय प्राप्त करना कैसे java.lang.NumberFormatException को हल करने के लिए: इनपुट स्ट्रिंग के लिए: "N / A"? पूर्ण पथ को दिए जाने वाले मॉड्यूल को कैसे आयात करें? मेरे Git कॉन्फ़िगरेशन में सेटिंग्स कहां से आती हैं? एक एल्गोरिथ्म की समय की जटिलता कैसे प्राप्त करें एसडीके 'आईओएस 10.0' में उत्पाद प्रकार 'एप्लिकेशन' के लिए कोड साइनिंग की आवश्यकता है – स्टिकरपैक एक्स्टेंशन को विकास टीम की गलती की आवश्यकता है मैं GitHub पर कमिट कैसे निकाल सकता हूं? ऑब्जेक्ट की सूची को सॉर्ट करने के लिए कैसे करें एक ही आईडी वाला कई तत्व एक सीएसएस आईडी चयनकर्ता को जवाब देते हैं

मौजूदा PowerShell स्क्रिप्ट का स्थान निर्धारित करने का सबसे अच्छा तरीका क्या है?

जब भी मुझे एक सामान्य मॉड्यूल या स्क्रिप्ट का संदर्भ देने की आवश्यकता होती है, मुझे मौजूदा स्क्रिप्ट फ़ाइल से संबंधित पथों का उपयोग करना है, इस तरह से, मेरी स्क्रिप्ट हमेशा पुस्तकालय में अन्य स्क्रिप्ट पा सकते हैं।

तो, मौजूदा स्क्रिप्ट की निर्देशिका का निर्धारण करने का सर्वोत्तम, मानक तरीका क्या है? वर्तमान में, मैं कर रहा हूं:

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition) 

मैं मॉड्यूल (.psm1) में जानता हूं आप इस जानकारी को प्राप्त करने के लिए $PSScriptRoot का उपयोग कर सकते हैं, लेकिन वह नियमित स्क्रिप्ट (यानी .ps1 फ़ाइलें) में सेट नहीं हो सकता है।

वर्तमान PowerShell स्क्रिप्ट फ़ाइल का स्थान प्राप्त करने के लिए वैधानिक तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "मौजूदा PowerShell स्क्रिप्ट का स्थान निर्धारित करने का सबसे अच्छा तरीका क्या है?"

पावरशेल 3+

 # This is an automatic variable set to the current file's/module's directory $PSScriptRoot 

पावरशेल 2

PowerShell 3 से पहले, MyInvocation.MyCommand.Definition सामान्य लिपियों के लिए प्रॉपर्टी की जांच करने से बेहतर तरीका नहीं था। मेरे पास प्रत्येक शक्तिशूल स्क्रिप्ट के शीर्ष पर निम्न पंक्ति थी:

 $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition 

यदि आप वी 2 मॉड्यूल बना रहे हैं, तो आप $PSScriptRoot नामक एक स्वचालित चर का उपयोग कर सकते हैं।

पीएस से> स्वचालित_वाचनीय मदद करें

 $ PSScriptRoot
        उस निर्देशिका को शामिल करता है जिसमें स्क्रिप्ट मॉड्यूल निष्पादित किया जा रहा है।
        यह चर स्क्रिप्ट को दूसरे तक पहुंचने के लिए मॉड्यूल पथ का उपयोग करने की अनुमति देता है
        संसाधनों।

PowerShell 3.0 के लिए

 $PSCommandPath Contains the full path and file name of the script that is being run. This variable is valid in all scripts. 

फ़ंक्शन तो है:

 function Get-ScriptDirectory { Split-Path -Parent $PSCommandPath } 

शायद मुझे यहाँ कुछ याद आ रहा है … लेकिन अगर आप वर्तमान कार्यशील निर्देशिका चाहते हैं तो आप इसका उपयोग कर सकते हैं: (Get-Location).Path स्ट्रिंग के लिए (Get-Location).Path , या ऑब्जेक्ट के लिए Get-Location

जब तक आप इस तरह से कुछ का उल्लेख नहीं कर रहे हैं, जो मुझे सवाल फिर से पढ़ने के बाद समझ में आ रहा है।

 function Get-Script-Directory { $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value return Split-Path $scriptInvocation.MyCommand.Path } 

मुझे स्क्रिप्ट का नाम जानने की जरूरत है और यह कहां से कार्यान्वित है।

"माइक्रोसॉफ्ट" को प्रीफ़िक्स करना "माइक्रोसॉफ्ट" संरचना से पूर्ण पथ और स्क्रिप्ट नाम देता है जब मुख्य स्क्रिप्ट दोनों से फोन किया जाता है, और आयातित .PSM1 लाइब्रेरी फ़ाइल की मुख्य पंक्ति। यह आयातित पुस्तकालय में किसी फ़ंक्शन के भीतर से काम करता है

चारों ओर बहुत नाखुश होने के बाद, मैं $ ग्लोबल: MyInvocation.InvocationName का उपयोग करने पर बसे। यह सीएमडी लॉन्च, पॉवरहेल के साथ रन और आईएसई के साथ मज़बूती से काम करता है। दोनों स्थानीय और यूएनसी लॉन्च की शुरूआत सही पथ पर लौटें

मैं स्वचालित चर $ ExecutionContext का उपयोग करता हूं, यह PowerShell 2 और बाद में से काम करता है।

 $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('.\') 

$ एक्ज़ीक्यूशन कॉन्टैक्ट में एक इंजिनट्रिक्सिक्स ऑब्जेक्ट शामिल होता है जो Windows PowerShell होस्ट के निष्पादन प्रसंग का प्रतिनिधित्व करता है। आप इस चर का उपयोग निष्पादन ऑब्जेक्ट्स को खोजने के लिए कर सकते हैं जो cmdlets के लिए उपलब्ध हैं।

स्वीकार्य उत्तर लेते हुए कुछ को विकसित करने के लिए मुझे कुछ समय लगे और इसे एक मजबूत समारोह में बदल दिया।

दूसरों के बारे में निश्चित नहीं है, लेकिन मैं दोनों पावरशेल संस्करण 2 और 3 पर मशीनों के साथ एक वातावरण में काम करता हूं इसलिए मुझे दोनों को संभालना आवश्यक है। निम्नलिखित फ़ंक्शन एक सुस्पष्ट फ़ॉलबैक प्रदान करता है:

 Function Get-PSScriptRoot { $ScriptRoot = "" Try { $ScriptRoot = Get-Variable -Name PSScriptRoot -ValueOnly -ErrorAction Stop } Catch { $ScriptRoot = Split-Path $script:MyInvocation.MyCommand.Path } Write-Output $ScriptRoot } 

इसका भी अर्थ यह है कि फ़ंक्शन उनके माता-पिता के दायरे के बजाय स्क्रिप्ट क्षेत्र को संदर्भित करता है जैसा कि उनके ब्लॉग में माइकल सोरेन्स द्वारा उल्लिखित किया गया है

पहले ही पोस्ट किए गए उत्तरों के समान है, लेकिन पाइपिंग को अधिक पीएस-जैसी लगता है।

 $PSCommandPath | Split-Path -Parent 

पार्सशेल 3+ के लिए

 function Get-ScriptDirectory { if ($psise) {Split-Path $psise.CurrentFile.FullPath} else {$global:PSScriptRoot} } 

मैंने इस फ़ंक्शन को मेरे प्रोफाइल में रखा है। आईएसई में एफ 8 / रन चयन का उपयोग भी करता है।

यदि आप अन्य विधियों में से किसी भी विफल हो तो आप split-path -parent $psISE.CurrentFile.Fullpath पर भी विचार कर सकते हैं। विशेष रूप से, यदि आप फ़ंक्शन का एक गुच्छा लोड करने के लिए फ़ाइल चलाते हैं और फिर ISE शेल में (या यदि आप चलाते हैं) के साथ उन फ़ंक्शन को निष्पादित करते हैं, तो ऐसा लगता है कि ऊपर Get-Script-Directory फ़ंक्शन कार्य नहीं करता है।

 function func1() { $inv = (Get-Variable MyInvocation -Scope 1).Value #$inv.MyCommand | Format-List * $Path1 = Split-Path $inv.scriptname Write-Host $Path1 } function Main() { func1 } Main