2008-11-11 13 views
13

मैं खुद को अलग-अलग संज्ञाओं (क्लस्टर्स, एसक्यूएल सर्वर, सामान्य रूप से सर्वर, फाइलों आदि) से संबंधित संबंधित कार्यों का एक समूह लिख रहा हूं और इन समूहों में से प्रत्येक समूह को अलग फ़ाइलों में डालता हूं (उदाहरण के लिए, cluster_utils.ps1 कहें)। मैं अपनी प्रोफाइल में इन पुस्तकालयों में से कुछ को "आयात" करने में सक्षम होना चाहता हूं और दूसरों को अपने पावरहेल सत्र में अगर मुझे उनकी ज़रूरत है तो "आयात" करने में सक्षम होना चाहता हूं। मैंने 2 कार्यों को लिखा है जो समस्या को हल करने लगते हैं, लेकिन चूंकि मैं केवल एक महीने के लिए पावरहेल का उपयोग कर रहा हूं, मैंने सोचा कि मैं यह देखने के लिए कहूंगा कि क्या कोई मौजूदा "सर्वोत्तम अभ्यास" प्रकार स्क्रिप्ट्स मैं इसके बजाय उपयोग कर सकता हूं।शक्तियों में "पुस्तकालय" आयात करना

इन कार्यों का उपयोग करने के लिए, मैं डॉट स्रोत उन्हें (अपने प्रोफ़ाइल या मेरे सत्र में) ... उदाहरण के लिए,

# to load c:\powershellscripts\cluster_utils.ps1 if it isn't already loaded 
. require cluster_utils  

यहाँ कार्य हैं:

$global:[email protected]{} 
function require([string]$filename){ 
     if (!$loaded_scripts[$filename]){ 
      . c:\powershellscripts\$filename.ps1 
      $loaded_scripts[$filename]=get-date 
    } 
} 

function reload($filename){ 
    . c:\powershellscripts\$filename.ps1 
    $loaded_scripts[$filename]=get-date 
} 

किसी भी प्रतिक्रिया होगा सहायक बनें।

+0

आप उन्हें PoshCode.org (एक समुदाय स्क्रिप्ट रिपॉजिटरी) में जोड़ना चाहेंगे –

+0

उस साइट पर नहीं था। धन्यवाद। –

+0

मैं स्टीवन से सहमत हूं ... बढ़िया विचार, खुशी है कि आप इसे साझा कर रहे हैं। मैंने पहले से ही संज्ञाओं में खुद को तोड़ दिया है, और मैं मूल रूप से ls lib * | % {। $ _} अभी इस बात के बावजूद कि कुछ लोड हो रहा है या नहीं। – halr9000

उत्तर

5

बिल्डिंग पर Steven's answer, एक और सुधार बार में एकाधिक फ़ाइलों को लोड करने की अनुमति के लिए हो सकता है:

$global:scriptdirectory = 'C:\powershellscripts' 
$global:loaded_scripts = @{} 

function require { 
    param(
    [string[]]$filenames=$(throw 'Please specify scripts to load'), 
    [string]$path=$scriptdirectory 
) 

    $unloadedFilenames = $filenames | where { -not $loaded_scripts[$_] } 
    reload $unloadedFilenames $path 
} 

function reload { 
    param(
    [string[]]$filenames=$(throw 'Please specify scripts to reload'), 
    [string]$path=$scriptdirectory 
) 

    foreach($filename in $filenames) { 
    . (Join-Path $path $filename) 
    $loaded_scripts[$filename] = Get-Date 
    } 
} 
3

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

एक परिवर्तन जो मैं करूँगा वह फ़ाइल स्थान को एक पैरामीटर भी बनाना होगा। आप इसके लिए एक डिफ़ॉल्ट मान सेट कर सकते हैं या इसके लिए वैश्विक चर का भी उपयोग कर सकते हैं। आपको ".ps1"

$global:scriptdirectory= 'c:\powershellscripts' 
$global:[email protected]{} 
function require(){ 
     param ([string]$filename, [string]$path=$scriptdirectory) 
     if (!$loaded_scripts[$filename]){ 
      . (Join-Path $path $filename) 
      $loaded_scripts[$filename]=get-date 
    } 
} 

function reload(){ 
    param ([string]$filename, [string]$path=$scriptdirectory) 
    . (Join-Path $path $filename) 
    $loaded_scripts[$filename]=get-date 
} 

अच्छे कार्यों को जोड़ने की आवश्यकता नहीं है!

1

मुझे लगता है कि तुम बहुत संतोषजनक होने के लिए PowerShell v2 की "मॉड्यूल" कार्यक्षमता मिल जाएगा। मूल रूप से आपके लिए इसका ख्याल रखता है।

+1

मेरी धारणा यह है कि मुझे v2 की बहुत सारी कार्यक्षमता बहुत संतोषजनक लगेगी। हालांकि, चूंकि रिलीज की तारीख बहुत दूर है, इसलिए मैं इसे इंस्टॉल करने से दूर रह रहा हूं। मैं जब भी कर सकता हूं v1 में अच्छे विचारों को लागू करने की कोशिश कर रहा हूं। –

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