टेस्ट स्क्रिप्ट:पावरहेल स्क्रिप्टिंग: फ़ंक्शन कॉल के दौरान कन्फ्रोसिस को लागू करने के लिए अनुशंसित तरीका घोंसला है?
function outer
{
[cmdletbinding(supportsshouldprocess=$true)]
param($s)
process
{
$pscmdlet.shouldprocess("outer $s", "ShouldProcess") | out-null
"" | out-file "outer $s"
inner ImplicitPassthru
inner VerbosePassthru -Verbose:$Verbose
inner WhatifPassthru -WhatIf:$WhatIf
}
}
function inner
{
[cmdletbinding(supportsshouldprocess=$true)]
param($s)
process
{
$pscmdlet.shouldprocess("inner $s", "ShouldProcess") | out-null
"" | out-file "inner $s"
}
}
"`n** NORMAL **"
outer normal
"`n** VERBOSE **"
outer verbose -Verbose
"`n** WHATIF **"
outer whatif -WhatIf
आउटपुट:
** NORMAL **
VERBOSE: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".
** VERBOSE **
VERBOSE: Performing operation "ShouldProcess" on Target "outer verbose".
VERBOSE: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".
** WHATIF **
What if: Performing operation "ShouldProcess" on Target "outer whatif".
What if: Performing operation "Output to File" on Target "outer whatif".
What if: Performing operation "ShouldProcess" on Target "inner ImplicitPassthru".
What if: Performing operation "Output to File" on Target "inner ImplicitPassthru".
What if: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "Output to File" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".
मेरी आँख करने के लिए वहाँ कई विषमताएं यहां हैं:
- -WhatIf निर्दिष्ट करना: $ foo होगा हमेशा $ WhatIf पर बारी कैली (और इसकी कॉलियों) में, कोई फर्क नहीं पड़ता कि $ foo क्या है।
- जब आप निर्दिष्ट करते हैं- क्या "असली के लिए" (मौजूदा चर में इसे बाधित किए बिना), यह स्पष्ट रूप से कॉलियों का प्रचार करता है। पासस्ट्रू या स्पैटिंग के लिए कोई ज़रूरत नहीं है।
- विपरीत नहीं - क्या स्पष्ट है, स्पष्ट-वर्बोज़ पूरी तरह से कॉलियों को कैस्केड नहीं करता है।
- जब आप मैन्युअल रूप से passthru -Verbose: $ foo करने का प्रयास करते हैं, तो आप देखते हैं कि व्यवहार समान है -क्या: $ foo। लेकिन यह केवल उन स्क्रिप्ट को प्रभावित करता है जो मैन्युअल रूप से $ psCmdlet का परीक्षण करते हैं। ShouldProcess() - cmdlets में निर्मित प्रभावित नहीं हैं।
एनबी।: पुष्टि करें कि क्या होता है। मैंने इसे संक्षिप्तता के लिए छोड़ दिया।
वेब खोजना और कनेक्ट करना, मुझे उन्नत कार्यों के संबंध में कंधप्रचार व्यवहार (प्रो या कॉन) की गहराई से चर्चा नहीं दिखती है। निकटतम बात a post from James O'Neill है जो पूरे कॉल स्टैक में $ pscmdlet का एक उदाहरण पास करने की अनुशंसा करता है। हालांकि, वह एक पूरी तरह से अलग समस्या (एकाधिक-कॉन्फर्म संकेतों से परहेज) से काम करने के लिए ऐसा करता है। इस बीच, जब आप प्रत्येक समारोह में प्रदान किए गए मानक $ psCmdlet के साथ चिपके रहते हैं, तो मुझे उम्मीद नहीं है कि क्या अपेक्षा की जा सकती है ... बहुत कम डिज़ाइन पैटर्न, सर्वोत्तम प्रथाओं, आदि ...
बग दायर: https://connect.microsoft.com/PowerShell/feedback/details/535559/shouldprocess-cmdlets-the-verbose-preference-is-not-evaluated-in-callees अशक्त मजबूर - > ट्रू भी एक बग आईएमओ है, क्योंकि यह सामान्य स्विच पैरामीटर के साथ नहीं होता है। अलग से दायर @ https://connect.microsoft.com/PowerShell/feedback/details/535557/shouldprocess- सिंथेटिक-parameters-should-not-coerce-null-true –
वोट दिया गया। उनको दाखिल करने के लिए धन्यवाद। –
अच्छा काम लोग। – JasonMArcher