2010-11-17 10 views
6

मैं अनिवार्य रूप से एक चर बनाना चाहता हूं जिसे हर बार निष्पादित किया जाएगा। सबसे सरल उदाहरण के लिए:क्या यह अपना 'स्वचालित चर' बनाना संभव है?

$myvar = `write-host foo`; 
हर

तब मैं $ myVar उत्पादन foo संदर्भित है, यह होगा:

dir $myvar 

Directory of foo: 

मुद्दा यह है कि write-host foo भाग किया जाएगा फिर से क्रियान्वित किया जा रहा हर मैं संदर्भ $ myVar

+1

क्यों एक विधि का उपयोग नहीं? http://www.computerperformance.co.uk/powershell/powershell_functions.htm – asawyer

+0

आपके उदाहरण में, डीआईआर $ myvar काम नहीं करेगा, क्योंकि लेखन-होस्ट डीआईआर के लिए आउटपुट नहीं होगा। आप लेखन-आउटपुट चाहते हैं, लेकिन आपको वास्तव में इसकी आवश्यकता नहीं है, आपको केवल $ $ myvar = 'foo'' – Jaykul

उत्तर

5

यह आपके स्वयं के PSVariable व्युत्पन्न वर्ग बनाकर प्रबंधित कोड (सी #/वीबी) में करने योग्य है, लेकिन सीधे शुद्ध लिपि में नहीं, क्षमा करें। मैं "शुद्ध लिपि" कहता हूं क्योंकि पावरहेल v2 में आप सी # को ऐड-टाइप के साथ रेखांकित कर सकते हैं। उस ने कहा, आप इसे टॉरिटिंग कॉल पर भरोसा करके स्क्रिप्ट में हैक कर सकते हैं लेकिन यह हर स्थिति में विश्वसनीय नहीं होगा। उदाहरण:

# empty custom object 
$o = new-object psobject 

# override ToString with a PSScriptMethod member 
$o.psobject.members.add((new-object ` 
    System.Management.Automation.PSScriptMethod "ToString", { 
     "ticks: $([datetime]::now.ticks)" })) 

ps> $o 
ticks: 634256043148813794 

ps> $o 
ticks: 634256043165574752 

नोट टिक गिनती चर में से प्रत्येक के मूल्यांकन पर अलग है। यदि निश्चित रूप से यदि आप एक चर के बजाय नियमित फ़ंक्शन का उपयोग करते हैं, तो यह बहुत आसान है।

function Ticks { [datetime]::now.ticks } 

# use as a parameter - note the use of (and) 
ps> write-host (ticks) 
634256043148813794 

# use in a string - note the use of $(and) 
ps> write-host "ticks $(ticks)" 
ticks 634256043165574752 

आशा इस मदद करता है

-Oisin

+1

की आवश्यकता है, मुझे यह पसंद है कि आपने इसके लिए ToString ओवरराइड का उपयोग करने के बारे में सोचा था। यदि आप इस तरह से जाते हैं, तो सुनिश्चित करें कि आप वेरिएबल रीडऑनली, कॉन्स्टेंट, ऑलस्कोप बनाते हैं, इसलिए इसे ओवरराइट नहीं किया जा सकता है, और याद रखें कि यह केवल तभी होता है जब आप इसे स्ट्रिंग में परिवर्तित करते हैं। अन्यथा यह कुछ और है। x0n: आप एक बीमार, बीमार प्रतिभाशाली हैं :) – Jaykul

+0

किसी कारण से यह स्वचालित चर के समान काम नहीं करता है, लेकिन वास्तव में बंद है। उदाहरण के लिए: "डीआईआर सी: \; डीआईआर $$" दोनों एक ही काम करेंगे। लेकिन उपरोक्त आपकी विधि के साथ "डीआईआर सी: \; डीआईआर $ ओ" नहीं है। यह आवश्यक है कि मैं "डीआईआर सी: \; डीआईआर ($ ओ)" करता हूं जो कि कष्टदायक है: रिकॉर्ड के लिए पी – esac

+0

: $$ मेरे उदाहरण में $ ओ की तरह है (जिसे मैंने अभी जोड़ा है) इसकी मांग पर गणना नहीं की गई है , यह प्रत्येक आदेश चलाने के बाद सेट है। मेरा मतलब कल उस विकल्प का जिक्र करना था, लेकिन मैं विचलित हो गया। – Jaykul

2

अन्य जिस तरह से आप बात बस की इस तरह लागू कर सकते हैं शीघ्र समारोह में पुनर्गणना के लिए मजबूर करने ताकि चर हर बार एक आदेश है अद्यतन किया जाता है है पूरी की और संकेत दिखाई देने पर:

$MySecretOldPromptStorage = ${Function:Prompt} 
function prompt { $o = $([datetime]::now.ticks); &$MySecretOldPromptStorage } 
बेशक

, कि उस में परिणाम हर बार की बजाय मांग पर

चलाया जा रहा
2

@ x0n उल्लेखों को पूरा करना मुश्किल नहीं है। हम अपने कोड में सी # का एक टुकड़ा एम्बेड और एक वास्तविक स्वत: चर प्राप्त कर सकते हैं:

# define a class of my variable, override the Value property 
Add-Type @' 
using System; 
using System.Management.Automation; 
public class MyVariable : PSVariable 
{ 
    public MyVariable(string name) : base(name) {} 
    public override object Value 
    { 
     get { return DateTime.Now.Ticks; } 
     set { } 
    } 
} 
'@ 

# install the variable 
$ExecutionContext.SessionState.PSVariable.Set((New-Object MyVariable Ticks)) 

# test 
$Ticks 
sleep 1 
$Ticks 
sleep 1 
$Ticks 

बारे PSVariable:

http://msdn.microsoft.com/en-us/library/system.management.automation.psvariable

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