दिलचस्प पोस्ट
कब मुझे एक सुरक्षित। स्ट्रिंग में आवश्यकता होगी? एएसपी.नेट एमवीसी डेटा टाइप एट्रिब्यूट्स का इस्तेमाल करते हुए ई-मेल एड्रेस वैधीकरण बड़ी फ़ाइलों के साथ Git JS.ParseJSON JSON में एक एकल उद्धरण के कारण "अमान्य JSON" त्रुटि फेंकता है PHP – और / या कीवर्ड कांगारू में "नियंत्रक के रूप में" का क्या लाभ है? एंड्रॉइड में चयनकर्ता के साथ कस्टम आकार बटन कैसे बनाएं? कैसल विंडसर का उपयोग करके मैं एक सामान्य डेकोरेटर कैसे रजिस्टर कर सकता हूं? फेसबुक मेरी साइट पर एक लिंक साझा नहीं करेगा Android पहुंच क्षमता सूचना सूचना का पता लगाता है Http-header "X-XSS-Protection" क्या है? एक वेबफ़ॉर्म के अंदर एक आंशिक दृश्य कैसे शामिल करें सी # में गतिशील रूप से निर्मित नियंत्रण हटा रहा है संरचना में संरचना को प्रतिलिपि बनाएँ सरल एक्सएमएल फ़ाइल से डेटा का निष्कर्षण

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

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

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

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

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

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

Solutions Collecting From Web of "मौजूदा 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