कमांड प्रॉम्प्ट से पावरशेल स्क्रिप्ट में बूलियन मान कैसे पास करें


103

मुझे एक बैच फ़ाइल से एक पॉवरशेल स्क्रिप्ट मंगानी है। स्क्रिप्ट का एक तर्क एक बूलियन मूल्य है:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false

निम्न त्रुटि के साथ कमांड विफल रहता है:

Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead.

At line:0 char:1
+  <<<< <br/>
+ CategoryInfo          : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/>
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1

अब तक मैं अपनी स्क्रिप्ट के अंदर बूलियन रूपांतरण के लिए एक स्ट्रिंग का उपयोग कर रहा हूं। लेकिन मैं PowerShell में बूलियन तर्क कैसे पारित कर सकता हूं?

जवाबों:


57

ऐसा प्रतीत होता है कि पॉवरशेल ..exe पूरी तरह से स्क्रिप्ट तर्कों का मूल्यांकन नहीं करता है जब -Fileपैरामीटर का उपयोग किया जाता है। विशेष रूप से, $falseतर्क को एक स्ट्रिंग मान के रूप में माना जा रहा है, नीचे दिए गए उदाहरण के लिए इसी तरह से:

PS> function f( [bool]$b ) { $b }; f -b '$false'
f : Cannot process argument transformation on parameter 'b'. Cannot convert value 
"System.String" to type "System.Boolean", parameters of this type only accept 
booleans or numbers, use $true, $false, 1 or 0 instead.
At line:1 char:36
+ function f( [bool]$b ) { $b }; f -b <<<<  '$false'
    + CategoryInfo          : InvalidData: (:) [f], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,f

उपयोग करने के बजाय -Fileआप कोशिश कर सकते हैं -Command, जो स्क्रिप्ट के रूप में कॉल का मूल्यांकन करेगा:

CMD> powershell.exe -NoProfile -Command .\RunScript.ps1 -Turn 1 -Unify $false
Turn: 1
Unify: False

जैसा कि डेविड सुझाव देते हैं, स्विच तर्क का उपयोग करना भी अधिक मुहावरेदार होगा, स्पष्ट रूप से बूलियन मान पारित करने की आवश्यकता को दूर करके कॉल को सरल बनाना:

CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True

6
उन लोगों के लिए (जैसे मेरे) जिन्हें "-फाइल" पैरामीटर रखना है, और स्विच तर्क में नहीं बदल सकते हैं, लेकिन जो स्ट्रिंग मान भेजे गए हैं, उन पर नियंत्रण है, तो सबसे सरल समाधान पैरामीटर को एक में बदलना है बूलियन का उपयोग कर [System.Convert] :: ToBoolean ($ Unify); स्ट्रिंग मान तब "सही" या "गलत" होना चाहिए।
क्रिस हैन्स

187

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

इस तरह:

param (
  [int] $Turn,
  [switch] $Unify
)

21
यह स्वीकृत उत्तर होना चाहिए। चर्चा को आगे बढ़ाने के लिए, आप किसी भी अन्य पैरामीटर की तरह एक डिफ़ॉल्ट मान सेट कर सकते हैं:[switch] $Unify = $false
मारियो टाॅक

मैंने इस उत्तर को अनदेखा कर दिया, क्योंकि मुझे यकीन था कि बुलियन जाने का रास्ता था। यह नहीं। "टाइप करने के लिए" System.Management.Automation.ParameterAttribute गलत "मूल्य कनवर्ट नहीं कर सकता" "मेरे लिए काम किया स्विच: स्विच बूलियन की कार्यक्षमता समाहित, और त्रुटियों के इन प्रकार के बंद हो जाता
TinyRacoon

2
@MarioTacke यदि आप स्क्रिप्ट को लागू करते समय स्विच पैरामीटर निर्दिष्ट नहीं करते हैं तो यह स्वचालित रूप से सेट हो जाता है $false। इसलिए स्पष्ट रूप से डिफ़ॉल्ट मान सेट करने की कोई आवश्यकता नहीं है।
डबलडाउन

इस सुझाव ने बहुत अच्छा काम किया; [बूल] से [स्विच] तक के किसी एक परिम को अपडेट करने में सक्षम था और इसने मुझे टास्क शेड्यूलर के माध्यम से तर्क पारित करने की अनुमति दी।
JustaDaKaje

12

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

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe

-फाइल पैरामीटर के लिए दस्तावेज़ीकरण में कहा गया है कि "दुर्लभ मामलों में, आपको स्विच पैरामीटर के लिए बूलियन मान प्रदान करने की आवश्यकता हो सकती है। फ़ाइल पैरामीटर के मान में स्विच पैरामीटर के लिए बूलियन मान प्रदान करने के लिए, पैरामीटर नाम और मान संलग्न करें। घुंघराले ब्रेसिज़, जैसे कि निम्नलिखित: -फाइल। \ Get-Script.ps1 {-All: $ गलत} "

मुझे इसे इस तरह लिखना था:

PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}

इसलिए सही / गलत बयान से पहले कोई '$' नहीं, और जो मेरे लिए PowerShell 4.0 पर काम करता है


1
साझा करने के लिए धन्यवाद! मेरी समस्या का पूरी तरह से समाधान किया।
जूलिया श्वार्ज़

1
उत्तर की लिंक से लगता है कि इसकी सामग्री बदल गई है। हालांकि, मैं इस सवाल का जवाब मिल गया यहाँ
Slogmeister असाधारण

वैकल्पिक दस्तावेज़ीकरण लिंक के बारे में_पॉवरशेलpowershell -h
सेठ

मुझे आश्चर्य है कि इस अजीब काम कभी - यह विंडोज PowerShell v5.1 में काम नहीं करता है (न ही एक अग्रणी के साथ और न ही $); यह भी ध्यान दें कि यह PowerShell Core में आवश्यक नहीं है । मैंने दस्तावेज को ठीक करने के लिए कहा है; देखें github.com/MicrosoftDocs/PowerShell-Docs/issues/4964
mklement0

11

अपने पैरामीटर का प्रकार निर्धारित करने का प्रयास करें [bool]:

param
(
    [int]$Turn = 0
    [bool]$Unity = $false
)

switch ($Unity)
{
    $true { "That was true."; break }
    default { "Whatever it was, it wasn't true."; break }
}

यदि कोई इनपुट प्रदान नहीं किया $Unityजाता है $falseतो यह उदाहरण डिफॉल्ट करता है।

प्रयोग

.\RunScript.ps1 -Turn 1 -Unity $false

1
-Fileपैरामीटर के संबंध में सम्राट XLII का उत्तर और उस पर आपकी टिप्पणी मूल प्रश्न के हर पहलू को कवर करती है। मैं अपना जवाब छोड़ दूंगा क्योंकि कोई व्यक्ति डिफ़ॉल्ट मान प्रदान करने पर भी मेरा संकेत पा सकता है।
फिल् मर्ट

अच्छा किया फिल्बर्ट। आपके उत्तर ने मुझे मेरी लिपि की जाँच करने के लिए प्रेरित किया, जो पहले से ही डिफ़ॉल्ट रूप में आवश्यक मूल्य $ के रूप में निर्दिष्ट है (मैंने लिखा है कि कई साल पहले और इसके बारे में सब भूल गया था) - इसलिए मुझे समस्याग्रस्त बूलियन पैरामीटर को निर्दिष्ट करने की आवश्यकता नहीं है अब कमांड लाइन। बहुत बढ़िया :)
Zeek2

5

मुझे लगता है, पैरामीटर के रूप में बूलियन मान का उपयोग / सेट करने का सबसे अच्छा तरीका यह है कि आप अपने पीएस स्क्रिप्ट में इसका उपयोग इस तरह करें:

Param(
    [Parameter(Mandatory=$false)][ValidateSet("true", "false")][string]$deployApp="false"   
)

$deployAppBool = $false
switch($deployPmCmParse.ToLower()) {
    "true" { $deployAppBool = $true }
    default { $deployAppBool = $false }
}

तो अब आप इसे इस तरह से उपयोग कर सकते हैं:

.\myApp.ps1 -deployAppBool True
.\myApp.ps1 -deployAppBool TRUE
.\myApp.ps1 -deployAppBool true
.\myApp.ps1 -deployAppBool "true"
.\myApp.ps1 -deployAppBool false
#and etc...

तो cmd से तर्क में आप साधारण स्ट्रिंग के रूप में बूलियन मान पास कर सकते हैं :)।


2

PowerShell में, बूलियन मापदंडों को उनके चर से पहले उनके प्रकार का उल्लेख करके घोषित किया जा सकता है।

    function GetWeb() {
             param([bool] $includeTags)
    ........
    ........
    }

आप $ true पास करके मान असाइन कर सकते हैं | $ झूठी

    GetWeb -includeTags $true

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

0

Windows PowerShell v5.1 / PowerShell Core 7.0.0-Preview.4 के रूप में मौजूदा उत्तरों को संक्षेप और पूरक करने के लिए :

डेविड Mohundro के जवाब हक अंक कि के बजाय [bool]मापदंडों का उपयोग करना चाहिए [switch]मापदंडों PowerShell में , जहां उपस्थिति बनाम अभाव स्विच नाम (की -Unifyनिर्दिष्ट बनाम नहीं निर्दिष्ट) अपने मूल्य का तात्पर्य है, जो मूल समस्या का समाधान करता है।


हालाँकि, इस अवसर पर आपको स्विच मूल्य को स्पष्ट रूप से पारित करने की आवश्यकता हो सकती है , खासकर यदि आप प्रोग्रामेटिक रूप से कमांड लाइन का निर्माण कर रहे हैं :


PowerShell Core में , मूल समस्या ( सम्राट XLII के उत्तर में वर्णित ) को ठीक कर दिया गया है

अर्थात्, $trueएक [switch]पैरामीटर को स्पष्ट रूप से पास करने के लिए जिसका नाम -Unifyआप अब लिख सकते हैं:

pwsh -File .\RunScript.ps1 -Unify:$true  # !! ":" separates name and value, no space

निम्न मान इस्तेमाल किया जा सकता: $false, false, $true, true, लेकिन ध्यान दें कि गुजर 0या 1करता है नहीं काम करते हैं।

ध्यान दें कि स्विच नाम को किस मान से अलग किया गया है :और दोनों के बीच कोई व्हाट्सएप नहीं होना चाहिए ।

नोट: यदि आप एक [bool]पैरामीटर की घोषणा करते हैं बजाय [switch](जिसे आप आमतौर पर नहीं करना चाहिए), तो आपको एक ही वाक्यविन्यास का उपयोग करना चाहिए; भले ही काम -Unify $false करना चाहिए , यह वर्तमान में नहीं है - इस GitHub मुद्दे को देखें


में विंडोज PowerShell , मूल समस्या बनी रहती है यह देखते हुए कि विंडोज PowerShell अब सक्रिय रूप से विकसित कर रहा है - -, और तय करने के लिए की संभावना नहीं है।

  • LarsWA के उत्तर में सुझाया गया वर्कअराउंड - भले ही यह इस लेखन के रूप में आधिकारिक सहायता विषय पर आधारित हो - v5.1 में काम नहीं करता है

    • यह GitHub मुद्दा प्रलेखन को ठीक करने के लिए कहता है और एक परीक्षण कमांड भी प्रदान करता है जो वर्कअराउंड की अप्रभावीता को दर्शाता है।
  • के -Commandबजाय का उपयोग -Fileकर केवल प्रभावी समाधान है :

:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true" 

जब -Commandआप PowerShell कोड के एक टुकड़े को प्रभावी रूप से पास कर रहे हों , जो तब सामान्य रूप से मूल्यांकन किया जाता है - और PowerShell के अंदर $trueऔर पास होने पर $falseकाम करता है (लेकिन नहीं true और false, जैसा कि अब भी स्वीकार किया गया है -File)।

कैविट्स :

  • उपयोग करने -Commandसे आपके तर्कों की अतिरिक्त व्याख्या हो सकती है, जैसे कि उनमें $वर्ण होते हैं । (के साथ -File, तर्क शाब्दिक हैं )।

  • उपयोग करने के -Commandपरिणामस्वरूप एक अलग निकास कोड हो सकता है

विवरण के लिए, यह उत्तर और यह उत्तर देखें


0

इन्वोक-कमांड के साथ एक फंक्शन में स्क्रिप्ट पास करते समय मेरे पास कुछ ऐसा ही था। मैंने डबल कोट्स के बजाय सिंगल कोट्स में कमांड को रन किया, क्योंकि यह तब एक स्ट्रिंग शाब्दिक बन जाता है।'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';


0

बैश से लिनक्स पर पॉवरशेल स्क्रिप्ट चलाने से भी यही समस्या होती है। यह लगभग LarsWA के जवाब के रूप में एक ही हल:

काम कर रहे:

pwsh -f ./test.ps1 -bool:true

काम नहीं कर रहा:

pwsh -f ./test.ps1 -bool=1
pwsh -f ./test.ps1 -bool=true
pwsh -f ./test.ps1 -bool true
pwsh -f ./test.ps1 {-bool=true}
pwsh -f ./test.ps1 -bool=$true
pwsh -f ./test.ps1 -bool=\$true
pwsh -f ./test.ps1 -bool 1
pwsh -f ./test.ps1 -bool:1

-3

तुम भी उपयोग कर सकते हैं 0के लिए Falseया 1के लिए True। यह वास्तव में सुझाव देता है कि त्रुटि संदेश में:

पैरामीटर 'एकीकृत' पर तर्क परिवर्तन को संसाधित नहीं कर सकता। मान "System.String"को टाइप करने के लिए परिवर्तित नहीं किया जा सकता "System.Boolean", इस प्रकार के पैरामीटर केवल बूलियन या संख्या को स्वीकार करते हैं, उपयोग करते हैं $true, इसके बजाय$false , 1 या 0।

अधिक जानकारी के लिए, बूलियन वैल्यूज़ एंड ऑपरेटर्स पर इस MSDN लेख को देखें ।


10
वह काम नहीं करता। यह पूर्णांक संख्या 1 या 0 की उम्मीद कर रहा है, लेकिन -Fileइसे स्ट्रिंग के रूप में व्याख्या करके गुजर रहा है , इस प्रकार एक ही त्रुटि के साथ विफल हो जाता है।
एरती-क्रिस इल्मा

यह उत्तर गलत है, क्योंकि यह सुझाव काम नहीं करता है
mjs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.