2009-03-26 25 views
48

में रिश्तेदार फ़ाइलों को शामिल करें मैं इस तरह के छद्म वाक्य रचना के साथ स्क्रिप्ट फ़ाइलें शामिल करना चाहते हैं:PowerShell

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent 
. ($thisScript + '.\scriptA.ps1') 

कि बदसूरत है:

Include '.\scripA.ps1' 

लेकिन केवल एक चीज मैं पाया है इस तरह की कुछ बात है ।

क्या अच्छा सापेक्ष पथों के साथ स्क्रिप्ट शामिल करने का तरीका है?

+2

पावरशेल बदसूरत – tofutim

उत्तर

11

दुर्भाग्य से नहीं, कोई अच्छा तरीका नहीं है। PowerShell वास्तव में V1 में बिल्कुल इस विचार का समर्थन नहीं करता है।

: सच दृष्टिकोण आप ले रहे हैं सबसे अच्छा तरीका

+0

और v2 के बारे में क्या है? क्या मुझे बाहरी स्क्रिप्ट और "आयात-मॉड्यूल ./foo.psm1" वाक्यविन्यास के लिए मॉड्यूल का उपयोग करना चाहिए? या सामान्य स्क्रिप्ट शामिल करने के लिए कोई सुधार? – alex2k8

+0

@ alex2k8, मैंने अभी भी V2 के साथ बहुत अधिक काम नहीं किया है, इसलिए मैं बहुत अधिक सहायता नहीं दे सकता।मुझे पता है कि मॉड्यूल को स्क्रिप्ट से कहीं अधिक अलग माना जाता है लेकिन इसके अलावा मेरे पास अधिक डेटा नहीं है। – JaredPar

+0

v2 में, आप एक मॉड्यूल का उपयोग एक मैनिफेस्ट के साथ कर सकते हैं जो सभी मॉड्यूल, स्क्रिप्ट, और यहां तक ​​कि स्नैपिन/असेंबली को परिभाषित करता है। इसका एक अच्छा लाभ यह है कि आपके पास मॉड्यूल के लिए निजी कार्य और चर हो सकते हैं। – JasonMArcher

27

आप कर सकते हैं डॉट स्रोत (शामिल) फ़ाइल है। । \ ScriptA.ps1

स्क्रिप्ट का पूरा पथ प्राप्त करने के लिए:।

हल-पथ \ scriptA.ps1

+0

नहीं, यह तब तक काम करता है जब तक मुख्य स्क्रिप्ट स्थान pwd के बराबर नहीं होता है। – alex2k8

+1

पहला भाग करता है ... लेकिन संकल्प-पथ वर्तमान निर्देशिका और फ़ाइल के लिए आपके पथ की जांच करेगा। यदि आपकी स्क्रिप्ट निर्देशिका आपके पथ ($ env: path) में है, तो उसे यह मिल जाएगा। –

+0

Thnaks दोस्तों, मुझे इलाज स्थान का उल्लेख करना चाहिए था। –

20

डॉट सोर्सिंग विशेष रूप से सुंदर नहीं यद्यपि सबसे आसान विकल्प, के रूप में पहले ही कहा गया है।

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path 
. (Join-Path $ScriptDirectory ScriptA.ps1) 

इसके अलावा, एक नोट के बारे में संबंधित पथ कि बनाने के लिए उपयोगी है स्पष्ट: मूल पोस्ट वर्तमान में एक ऐसा पथ रिश्तेदार चाहने मतलब है लग सकता है हालांकि, इस प्रारूप यह सिर्फ एक बालक सा स्वच्छ बनाता है कार्यशील निर्देशिका; हकीकत में इरादा वर्तमान स्क्रिप्ट की स्रोत निर्देशिका (जैसा कि alex2k8 का अपना कोड नमूना इंगित करता है) के सापेक्ष होना चाहिए। इस प्रकार, यह वर्तमान स्क्रिप्ट को उसी रिपॉजिटरी से अन्य स्क्रिप्ट तक पहुंचने की अनुमति देता है।

4

V2 के रूप में (देशी Win7/2008R2 के साथ शुरू; $psversiontable.psversion देखें) आप आसानी से ऐसा तरह एक फ़ाइल को शामिल कर सकते हैं:

. "RelativeOrAbsolutePathToFile\include.ps1" 

$result = FunctionInIncludeFile() 

संदर्भ:
How to reuse windows powershell functions in scripts

+6

जहां तक ​​मैं कह सकता हूं, इसके साथ समस्या यह है कि डॉट-स्रोत लाइन वाली स्क्रिप्ट के सापेक्ष, वर्तमान कार्य निर्देशिका के सापेक्ष डॉट-स्रोत लाइन का मूल्यांकन किया जाता है। इसलिए यदि आप उस निर्देशिका में 'cd' रखते हैं जिसमें स्क्रिप्ट शामिल है तो यह पहले काम करता है, लेकिन यदि आप इसे किसी अन्य निर्देशिका से कॉल करते हैं तो यह नहीं है। –

+0

शायद यह डिज़ाइन द्वारा है, हालांकि टिप्पणी के लिए धन्यवाद दोस्त! –

71

आप $ PSScriptRoot पैरामीटर का उपयोग कर सकते इस तरह:

. "$PSScriptRoot\script.ps1" 
+4

यह एकमात्र उत्तर है जो – Richard

+0

काम करता है जो पर्याप्त समाधान है जो मेरे लिए काम करता है! – Omar

0

यह शायद किसी भी निर्देशिका से काम करेगा, लेकिन यह एक slooo होगा ooowwwww पाते हैं कि क्या आपकी प्रारंभिक निर्देशिका उस फ़ाइल की प्रत्यक्ष पूर्ववर्ती निर्देशिका नहीं है जिसे आप शामिल करने का प्रयास कर रहे हैं। IOW, यदि इस खोज के लिए आपका प्रारंभिक बिंदु सी: \ या कुछ अन्य ड्राइव अक्षर की जड़ है, तो यह शायद बहुत ही धीमी गति से धीमा हो जाएगा।

। $ (समाधान-पथ-लिटरल $ (जीसीआई-रीकर्स शामिल हैं .ps1))

यदि आप अपने पीसी पर स्क्रिप्ट विकसित कर रहे हैं तो यह विशेष रूप से अच्छी तरह से काम करेगा, लेकिन उन्हें एक सर्वर पर तैनात करने की आवश्यकता है जो स्क्रिप्ट को चलाने के लिए जा रहा है एक निर्धारित कार्य।