2009-04-18 4 views
15

मान लीजिए कि आप एक सिस्टम व्यवस्थापक हैं जो PowerShell का उपयोग अपने सिस्टम पर बहुत सी चीजों को प्रबंधित करने के लिए करता है।किसी भी निर्देशिका से PowerShell में सभी कार्यों को लोड करें

आपने शायद बहुत सारे फ़ंक्शन लिखे हैं जो आपको नियमित रूप से जांचने की आवश्यकता होती है। हालांकि, अगर आपको बहुत कुछ स्थानांतरित करना है, तो विभिन्न मशीनों का उपयोग करें और इसी तरह, आपको उनका उपयोग करने में सक्षम होने के लिए बार-बार अपने सभी कार्यों को दोबारा दर्ज करना होगा। मुझे हर बार जब भी मैं बाहर निकलता हूं और PowerShell को किसी कारण से पुनरारंभ करता हूं, क्योंकि यह कार्यों को याद नहीं रखेगा ...

मैंने एक ऐसा फ़ंक्शन लिखा है जो मेरे लिए यह करता है। मैं इसे यहां पोस्ट कर रहा हूं क्योंकि मैं निश्चित होना चाहता हूं कि यह मूर्खतापूर्ण है। फ़ंक्शन स्वयं allFunctions.ps1 में संग्रहीत है, इसलिए मैंने इसे कोड में शामिल कर दिया है।

मूल विचार यह है कि आपके पास एक फ़ोल्डर है जिसमें आप अपनी सभी ps1 फ़ाइलों को संग्रहीत करते हैं जिनमें प्रत्येक में एक फ़ंक्शन शामिल होता है। PowerShell में, आप उस निर्देशिका के लिए जाना और फिर आप दर्ज करें:

[string]$items = Get-ChildItem -Path . -Exclude allFunctions.ps1 
$itemlist = $items.split(" ") 
foreach($item in $itemlist) 
{ 
    . $item 
} 

यह स्क्रिप्ट पहले अपने निर्देशिका में हर फ़ाइल एकत्रित करेगा, सभी गैर अर्थ:

. .\allFunctions.ps1 

कि स्क्रिप्ट की सामग्री यह है ps1 फाइलें जो आपके पास भी हो सकती हैं। allFunctions.ps1 को बाहर रखा जाएगा।

फिर मैंने अंतरिक्ष के आधार पर लंबी स्ट्रिंग को विभाजित किया, जो यहां सामान्य विभाजक है। और फिर मैं इसे फोरच-लूप के साथ चलाता हूं, प्रत्येक बार PowerShell में फ़ंक्शन प्रारंभ करना।

मान लें कि आपके पास 100 से अधिक फ़ंक्शन हैं और आप कभी नहीं जानते कि आपको किसकी आवश्यकता होगी और आप कौन नहीं करेंगे? नाइटपिकिंग के बजाय उन सभी को क्यों न दर्ज करें?

तो मैं सोच रहा हूं, यहां क्या गलत हो सकता है? मैं चाहता हूं कि यह वास्तव में सुरक्षित हो, क्योंकि मैं शायद इसका उपयोग कर रहा हूं।

उत्तर

15

उन्हें अपनी पावरशेल प्रोफ़ाइल में शामिल करें ताकि जब भी आप पीएस शुरू करेंगे, वे स्वचालित रूप से लोड हो जाएंगे।

अपनी प्रोफ़ाइल स्क्रिप्ट कहां खोजें, इसके बारे में अधिक जानकारी के लिए Windows PowerShell Profiles पर देखें।

पीएस आपकी प्रोफ़ाइल को आपके "मेरे दस्तावेज़" फ़ोल्डर में डिफ़ॉल्ट रूप से डिफ़ॉल्ट करता है। मेरा नेटवर्क ड्राइव पर है, इसलिए कहीं भी मैं लॉगिन करता हूं, पावरशेल एक ही प्रोफाइल फ़ोल्डर को इंगित करता है।

+0

Awsome सामान, पावरहेल के बारे में नहीं पता था। – KdgDev

6

कार्यक्षमता के अनुसार मुझे लगता है कि आप अपनी स्क्रिप्ट को बेहतर बनाने के कुछ तरीके हैं।

पहला यह है कि आपकी स्क्रिप्ट स्क्रिप्ट के नाम पर निर्भर नहीं है। हालांकि मुझे नहीं लगता कि यह संभव है कि आप इस स्क्रिप्ट का नाम बदल देंगे, आप कभी भी नहीं जानते कि आप कुछ वर्षों से क्या मूड करेंगे। इसके बजाए गतिशील रूप से स्क्रिप्ट के नाम की गणना क्यों न करें।

$scriptName = split-path -leaf $MyInvocation.MyCommand.Definition 

अगले समस्या मुझे विश्वास है कि आप कर रहे हैं विभाजन समारोह असफल हो जायेगी अगर आप कभी भी एक रास्ता है जो एक स्थान शामिल हैं में निर्देशिका जगह है। यह "c: \ foo bar \ baz.ps1" जैसे पथ को "c: \ foo", "bar \ baz.ps1" के रूप में दिखाई देगा। विभाजन को हटाने के लिए बहुत बेहतर है और get-childitem कमांड द्वारा गणना का उपयोग करें।

इसके अलावा आप स्क्रिप्ट वाले पथ होने वाले वर्तमान पथ पर निर्भरता ले रहे हैं। आपको या तो इसे एक स्पष्ट पैरामीटर बनाना चाहिए या allFunctions.ps1 फ़ाइल वाले पथ का उपयोग करना चाहिए (मैं बाद वाले को पसंद करता हूं)

यहां अद्यतन संस्करण है जिसका मैं उपयोग करूंगा।

$scriptName = split-path -leaf $MyInvocation.MyCommand.Definition 
$rootPath = split-path -parent $MyInvocation.MyCommand.Definition 
$scripts = gci -re $rootPath -in *.ps1 | ?{ $_.Name -ne $scriptName } 
foreach ($item in $scripts) { 
    . $item.FullName 
} 

एक सुरक्षा के दृष्टिकोण आप संभावना पर विचार करने कि एक दुर्भावनापूर्ण उपयोगकर्ता लक्ष्य निर्देशिका में एक बुरा स्क्रिप्ट कहते है से। यदि उन्होंने ऐसा किया है तो यह आपके allFunctions.ps1 फ़ाइल के साथ निष्पादित किया जाएगा और कंप्यूटर को नुकसान पहुंचा सकता है।लेकिन इस बिंदु पर दुर्भावनापूर्ण उपयोगकर्ता के पास आपके फाइल सिस्टम तक पहुंच है, ऐसा लगता है कि वे आपकी स्क्रिप्ट की सहायता के बिना नुकसान कर सकते हैं, इसलिए शायद यह मामूली चिंता है।

+0

वह पीएस में हमेशा के लिए तारों का उपयोग करना पसंद करता है :) – Joey

+0

मदद के लिए धन्यवाद, आपने कुछ अच्छे बिंदु का उल्लेख किया है। और वास्तव में एक हैकर जो मिल गया है शायद वैसे भी अधिक नुकसान लोड करेगा। इसके अलावा, जोहान, मुझे यह नहीं लगता कि मुझे पीएस में स्ट्रिंग पसंद है, यह और अधिक है कि जब मैं एक स्ट्रिंग होना चाहिए, तो एक स्ट्रिंग के बजाय एक त्रुटि दर्ज की जाती है, तो स्क्रिप्ट के बजाय एक त्रुटि फेंक दी जाएगी, फिर भी कुछ ऐसा करने की कोशिश कर रहा है इसके साथ। – KdgDev

+1

Get-ChildItem FileInfo/DirectoryInfo ऑब्जेक्ट्स का संग्रह वापस कर देगा। इसके बजाय आप वहां एक संख्या का उपयोग करने की कोशिश नहीं कर सकते। – Joey

10

आप इसे सरल तरीके से कर सकते हैं। मैं अपनी प्रोफ़ाइल में इस है:

##------------------------------------------- 
## Load Script Libraries 
##------------------------------------------- 
Get-ChildItem ($lib_home + "*.ps1") | ForEach-Object {& (Join-Path $lib_home $_.Name)} | Out-Null 

कहां $ lib_home कि स्क्रिप्ट है कि मैं ऑटो करना चाहते हैं संग्रहीत करता है एक फ़ोल्डर है। इस मामले में यह उन्हें निष्पादित करता है। इसलिए मेरे पास स्क्रिप्ट्स वैश्विक कार्यों को परिभाषित करती हैं। आप उन्हें स्रोत भी कर सकते हैं ("" को "।" से प्रतिस्थापित करें)।

+0

दिलचस्प। मुझे यह कोशिश करनी होगी। बीटीडब्ल्यू, आपके पास एक बहुत ही रोचक शीर्षक है। : पी यह वास्तव में कोई आश्चर्य नहीं है कि यह अपना समर्पित काम होगा हालांकि। मैंने पिछले दो हफ्तों में बस अपनी कंपनी, लॉल के लिए एक नए वेब सर्वर के लिए कॉन्फ़िगरेशन पर काम किया है, यद्यपि सड़क के किनारे और रास्ते में बाधाओं के बावजूद। – Chiramisu

0

सरल समाधान:

$Path - file location 
$Name - exluded file 

Get-ChildItem -Path $Path | Where {$_.psIsContainer -eq $false}|Where { $_.Name -like "*.ps1" }|Where { $_.Name -ne $Name }|foreach-object -process {.$_.FullName}|out-null 

read all object|file only| powershell file only|exclude file $Name| run ...|out-null 
0

एक अन्य समाधान एक मॉड्यूल में कार्यों गठबंधन करने के लिए (psm1) फ़ाइल और आयात है कि आयात-मॉड्यूल कमांड के साथ। जैसा कि ऊपर वर्णित है, आप अपनी प्रोफ़ाइल में आयात-मॉड्यूल कमांड जोड़ सकते हैं लेकिन वाक्यविन्यास बहुत आसान है।

शुरू करने का एक आसान तरीका है अपने WindowsPowerShell निर्देशिका में मॉड्यूल नामक फ़ोल्डर बनाना। उस फ़ोल्डर में अपने मॉड्यूल के नाम के साथ एक और फ़ोल्डर बनाएँ। आपकी psm1 फ़ाइल यहां सहेजी गई है। फिर WindowsPowerShell निर्देशिका में मौजूद अपनी प्रोफ़ाइल में आयात-मॉड्यूल ModuleName.psm1 जोड़ें। यदि आप किसी भिन्न प्रोफ़ाइल का उपयोग करना चाहते हैं या अपने मॉड्यूल को दूसरे स्थान पर सहेजना चाहते हैं, तो आपको तदनुसार पथ में हेरफेर करना होगा।

एक और युक्ति आपके मॉड्यूल फ़ाइल में प्रत्येक फ़ंक्शन के लिए निर्यात-मॉड्यूलमेम्बर फ़ंक्शननाम का उपयोग करना है। यह अंतिम उपयोगकर्ताओं के लिए सहायक फ़ंक्शन को अस्पष्ट कर देगा जो आप इसे वितरित कर सकते हैं।

0

मैं अपने Microsoft.PowerShell_profile.ps1 में PowerShell 4 और निम्नांकित दो पंक्तियों का उपयोग करें:

$modules = $env:USERPROFILE + "\..\*.psm1" 
Import-Module $modules 

इसके अलावा: A tutorial to create advanced modules

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