কমান্ড প্রম্পট থেকে পাওয়ারশেল স্ক্রিপ্টে বুলিয়ান মানগুলি কীভাবে পাস করতে হয়


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

এখন পর্যন্ত আমি আমার স্ক্রিপ্টের ভিতরে বুলিয়ান রূপান্তর করতে একটি স্ট্রিং ব্যবহার করছি। তবে আমি কীভাবে পাওয়ারশেলের কাছে বুলিয়ান যুক্তিগুলি পাস করতে পারি?

উত্তর:


57

দেখা যাচ্ছে যে -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
তাদের জন্য (আমার মতো) যাদের "-ফাইলে" প্যারামিটার রাখতে হবে, এবং একটি সুইচ আর্গুমেন্টে পরিবর্তন করতে পারে না, তবে প্রেরিত স্ট্রিংয়ের মানগুলির নিয়ন্ত্রণ আছে তবে সহজ সমাধানটি হল প্যারামিটারটিকে একটিতে রূপান্তর করা বুলিয়ান [সিস্টেম.কন্টভার্ট] :: টুবুলিয়ান ($ ইউনিফাইটি) ব্যবহার করে; স্ট্রিংয়ের মানগুলি অবশ্যই "সত্য" বা "মিথ্যা" হওয়া উচিত।
ক্রিস হেইনেস

187

পরিবর্তে স্যুইচ প্যারামিটার ব্যবহার করার জন্য আরও পরিষ্কার ব্যবহার হতে পারে। তারপরে, ইউনিফাইড প্যারামিটারের অস্তিত্বের অর্থ এটি সেট করা ছিল।

তাই ভালো:

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

21
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আলোচনাটি আরও এগিয়ে নেওয়ার জন্য, আপনি অন্য কোনও প্যারামিটারের মতো একটি ডিফল্ট মান সেট করতে পারেন:[switch] $Unify = $false
মারিও টেক

আমি এই উত্তরটিকে অগ্রাহ্য করেছি, কারণ আমি নিশ্চিত যে বুলিয়ানই যাওয়ার উপায় ছিল। এইটা না. স্যুইচ বুলিয়ানটির কার্যকারিতা encapsulates, এবং এই ধরণের ত্রুটিগুলি থামায়: "" ফলস "মান" টাইপ রূপান্তর করতে পারবেন না "System.Management.Outomation.ParameterAttribute"। স্যুইচস আমার জন্য কাজ করে।
টিনিআরাকুন

2
@ মারিওট্যাক যদি আপনি স্ক্রিপ্টটি চালু করার সময় স্যুইচ প্যারামিটারটি নির্দিষ্ট না করেন তবে এটি স্বয়ংক্রিয়ভাবে সেট হয়ে যায় $false। সুতরাং স্পষ্টভাবে একটি ডিফল্ট মান সেট করার প্রয়োজন নেই।
ডাবলডাউন

এই পরামর্শটি খুব ভাল কাজ করেছে; [বুল] থেকে [স্যুইচ] করতে একটি প্যারাম আপডেট করতে সক্ষম হয়েছিল এবং এটি আমাকে সফলভাবে কার্য শিডিউলারের মাধ্যমে যুক্তিটি পাস করার অনুমতি দেয়।
JustaDaKaje

12

এটি একটি পুরানো প্রশ্ন, তবে পাওয়ারশেল ডকুমেন্টেশনে এটির একটি উত্তর আসলে রয়েছে। আমারও একই সমস্যা ছিল এবং একবারের জন্য আরটিএফএম আসলে এটি সমাধান করেছিল। প্রায়।

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

-ফিট প্যারামিটারের জন্য ডকুমেন্টেশন বলছে যে "বিরল ক্ষেত্রে আপনার একটি স্যুইচ প্যারামিটারের জন্য বুলিয়ান মান প্রদানের প্রয়োজন হতে পারে File ফাইল প্যারামিটারের মানটিতে একটি স্যুইচ প্যারামিটারের জন্য বুলিয়ান মান সরবরাহ করতে, প্যারামিটারের নাম এবং মানটি সংযুক্ত করুন কোঁকড়া ধনুর্বন্ধনী, যেমন নিম্নলিখিত: - ফাইল।

আমাকে এটি লিখতে হয়েছিল:

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

সুতরাং সত্য / মিথ্যা বক্তব্যের আগে '$' নেই, এবং এটি পাওয়ারশেল ৪.০-তে আমার পক্ষে কাজ করেছে


1
ভাগ করার জন্য আপনাকে ধন্যবাদ! আমার সমস্যা নিখুঁতভাবে সমাধান।
জুলিয়া শোয়ার্জ

1
উত্তরের লিঙ্কটি দেখে মনে হচ্ছে এটির সামগ্রী পরিবর্তন হয়েছে changed যাইহোক, আমি উত্তরটি এখানে
স্লগমিস্টার এক্সট্রাওর্ডাইনায়ার

বর্তমান ডকুমেন্টেশন লিংক সম্পর্কে_পাওয়ারশেল.এক্সে বিকল্পভাবে সবেমাত্র চলছে powershell -h
শেঠ

আমি অবাক হয়েছি যে এই বিশ্রী কাজটি কখনও কাজ করেছিল - এটি উইন্ডোজ পাওয়ারশেল v5.1 এ নেই (নেতৃত্বের সাথে বা ছাড়াও নয় $); এছাড়াও খেয়াল করুন যে পাওয়ারশেল কোরে এটি আর দরকার নেই । ডকুমেন্টেশন সংশোধন করার জন্য বলেছি; দেখতে 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প্যারামিটার সম্পর্কিত এটি সম্পর্কে আপনার মন্তব্যে মূল প্রশ্নের প্রতিটি দিকই coverেকে রাখা উচিত। আমি আমার উত্তরটি ছেড়ে দেব কারণ কেউ একটি ডিফল্ট মানকে দরকারী সরবরাহ করার জন্য আমার ইঙ্গিতটিও খুঁজে পেতে পারে।
ফিলবার্ট

ভাল কাজ ফিলবার্ট। আপনার উত্তরটি আমাকে আমার স্ক্রিপ্টটি পরীক্ষা করতে বাধ্য করেছিল, যা ইতিমধ্যে ডিফল্টটিকে প্রয়োজনীয় মান হিসাবে নির্ধারিত করেছে $ মিথ্যা (আমি লিখেছি যে বেশ কয়েক বছর আগে এবং এটি সম্পর্কে সমস্ত কিছু ভুলে গিয়েছিলাম) - সুতরাং আমাকে সমস্যাযুক্ত বুলেটিয়ান প্যারামিটারটি নির্দিষ্ট করতে হবে না কমান্ড লাইন এখন। দুর্দান্ত :)
জেক 2

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...

তাই সেন্টিমিডি থেকে যুক্তিগুলিতে আপনি বুুলিয়ান মানটিকে সাধারণ স্ট্রিং হিসাবে পাস করতে পারেন :)।


2

পাওয়ারশেলে, বুলিয়ান প্যারামিটারগুলি তাদের ভেরিয়েবলের আগে তাদের ধরণের উল্লেখ করে ঘোষণা করা যেতে পারে।

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

আপনি $ সত্য | পাস করে মান নির্ধারণ করতে পারেন $ মিথ্যা

    GetWeb -includeTags $true

কেবলমাত্র নামের ইনপুট আর্গুমেন্টগুলি স্পষ্টভাবে পাস করা যেমন একটি ট্রিট কাজ করেছিল। ধন্যবাদ আহমেদ
স্টিভ টেলর

0

করতে সংক্ষেপ এবং পরিপূর্ণ বিদ্যমান উত্তর , উইন্ডোস PowerShell v5.1 / PowerShell কোর 7.0.0-preview.4 হিসাবে:

ডেভিড মহুন্দ্রোর উত্তর যথাযথভাবে নির্দেশ করে যে পরামিতিগুলির পরিবর্তে [bool]আপনার পাওয়ারশলে [switch]প্যারামিটার ব্যবহার করা উচিত , যেখানে উপস্থিতি বনাম স্যুইচ নামের অনুপস্থিতি ( -Unifyনির্দিষ্ট বনাম নির্দিষ্ট নয় ) এর মান বোঝায় , যা মূল সমস্যাটি দূরে সরিয়ে দেয়।


তবে, উপলক্ষে আপনাকে এখনও স্যুইচ মানটি স্পষ্টভাবে পাস করার প্রয়োজন হতে পারে , বিশেষত যদি আপনি প্রোগ্রামের মাধ্যমে একটি কমান্ড লাইন তৈরি করে থাকেন :


PowerShell ইন কোর , মূল সমস্যা (বর্ণিত সম্রাট 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 উচিত , এটি বর্তমানে তা করে না - এই গিটহাবটি সমস্যাটি দেখুন


ইন উইন্ডোজ PowerShell , মূল সমস্যাটি থেকে দেওয়া যে উইন্ডোজ PowerShell আর সক্রিয়ভাবে বিকশিত হয় - - এবং সংশোধন করা হয়েছে পেতে করার সম্ভাবনা কম।

:: # 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

বাশ থেকে লিনাক্সে পাওয়ারশেল স্ক্রিপ্টগুলি চালানো একই সমস্যা দেয়। এটিকে লার্সডাব্লিউএর উত্তরের মতোই সমাধান করেছেন:

ওয়ার্কিং:

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, পরিবর্তে 1$false , 0 বা 0 গ্রহণ করে।

আরও তথ্যের জন্য, বুলিয়ান মান এবং অপারেটরগুলির উপর এই এমএসডিএন নিবন্ধটি দেখুন ।


10
যে কাজ করে না। এটি সংখ্যার 1 বা 0 নম্বর প্রত্যাশা করছে, তবে এটির মাধ্যমে পাসিং এটি -Fileস্ট্রিং হিসাবে ব্যাখ্যা করে, সুতরাং একই ত্রুটিতে ব্যর্থ হয়।
এরতি-ক্রিস ইলমা

এই উত্তরটি ভুল, কারণ প্রস্তাবটি কাজ করে না
এমজেএস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.