পাওয়ারশেলে ব্যবহারকারী ইনপুটটির জন্য অনুরোধ জানানো হবে


209

আমি ব্যবহারকারীকে একটি পাসওয়ার্ড এবং একটি ফাইলের নাম সহ সিরিজের ইনপুটগুলির অনুরোধ জানাতে চাই।

আমার ব্যবহারের উদাহরণ রয়েছে host.ui.promptযা বুদ্ধিমান বলে মনে হয়, তবে আমি রিটার্নটি বুঝতে পারি না।

পাওয়ারশেলে ব্যবহারকারীর ইনপুট পাওয়ার আরও কি ভাল উপায় আছে?

উত্তর:


333

Read-Host কোনও ব্যবহারকারীর কাছ থেকে স্ট্রিং ইনপুট পাওয়ার জন্য একটি সহজ বিকল্প।

$name = Read-Host 'What is your username?'

পাসওয়ার্ডগুলি আড়াল করতে আপনি ব্যবহার করতে পারেন:

$pass = Read-Host 'What is your password?' -AsSecureString

পাসওয়ার্ডটিকে সরল পাঠ্যে রূপান্তর করতে:

[Runtime.InteropServices.Marshal]::PtrToStringAuto(
    [Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))

টাইপ হিসাবে ফিরে $host.UI.Prompt() , যদি আপনি @ খ্রিস্টানদের মন্তব্যে পোস্ট করা লিঙ্কে কোডটি চালান, আপনি এটির পাইপ দিয়ে রিটার্নের ধরণটি Get-Member(উদাহরণস্বরূপ $results | gm) খুঁজে পেতে পারেন। ফলাফল একটি অভিধান যেখানে কীটি FieldDescriptionপ্রম্পটে ব্যবহৃত কোনও বস্তুর নাম । লিঙ্ক উদাহরণে প্রথম প্রম্পট জন্য ফলাফলের অ্যাক্সেস করতে আপনার টাইপ করা হবে: $results['String Field']

কোনও পদ্ধতি না চালিয়ে তথ্য অ্যাক্সেস করতে, প্রথম বন্ধনী ছেড়ে দিন:

PS> $Host.UI.Prompt

MemberType          : Method
OverloadDefinitions : {System.Collections.Generic.Dictionary[string,psobject] Pr
                    ompt(string caption, string message, System.Collections.Ob
                    jectModel.Collection[System.Management.Automation.Host.Fie
                    ldDescription] descriptions)}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : System.Collections.Generic.Dictionary[string,psobject] Pro
                    mpt(string caption, string message, System.Collections.Obj
                    ectModel.Collection[System.Management.Automation.Host.Fiel
                    dDescription] descriptions)
Name                : Prompt
IsInstance          : True

$Host.UI.Prompt.OverloadDefinitionsআপনাকে পদ্ধতির সংজ্ঞা (গুলি) দেবে। প্রতিটি সংজ্ঞা হিসাবে প্রদর্শিত হয় <Return Type> <Method Name>(<Parameters>)


ধন্যবাদ, @ রাইনেন্ট। একমাত্র তিনিই আমার মূল প্রশ্নের উত্তর দিয়েছেন বলেই গৃহীত উত্তর! ;) অন্যান্য সমস্ত তথ্যও সত্যিই সহায়ক, বিশেষত যেহেতু আমি এখনও পিএস-এ আমার পথ চালাচ্ছি।
এজে।

সমস্যা নেই, @ এজে। কোনও পদ্ধতি সম্পর্কে তথ্য পাওয়ার আরেকটি উপায় হ'ল বন্ধনী বন্ধ করা। আমি আমার উত্তরে একটি উদাহরণ যুক্ত করব।
রিন্যান্ট

3
আপনি যদি ব্যবহারকারীর নাম এবং পাসওয়ার্ড পেয়ে থাকেন তবে এফওয়াইআই আপনি গেট-শংসাপত্রও ব্যবহার করতে পারেন।
ম্যাট লিয়নস

75

প্যারামিটার বাইন্ডিং ব্যবহার করা অবশ্যই এখানে যাওয়ার উপায়। এটি কেবল খুব দ্রুতই লেখা নয় (কেবল যুক্ত করুন[Parameter(Mandatory=$true)] আপনার বাধ্যতামূলক পরামিতিগুলির উপরে ), তবে এটি কেবলমাত্র একমাত্র বিকল্প যা আপনি পরে নিজেকে ঘৃণা করবেন না।

আরও নীচে:

[Console]::ReadLineপাওয়ারশেলের জন্য FxCop বিধি দ্বারা স্পষ্টভাবে নিষিদ্ধ । কেন? কারণ এটি কেবল পাওয়ারশেল.এক্সইতে কাজ করে, পাওয়ারশেল আইএসই , পাওয়ারজিইউআই ইত্যাদি নয়

পঠন-হোস্টটি বেশ সহজভাবে, খারাপ ফর্ম। রিড-হোস্ট অনিয়ন্ত্রিতভাবে স্ক্রিপ্টটি ব্যবহারকারীকে প্রম্পট করার জন্য থামায়, যার অর্থ আপনার আর কখনও স্ক্রিপ্ট থাকতে পারে না যার মধ্যে পঠন-হোস্ট ব্যবহার করে এমন স্ক্রিপ্ট থাকে।

আপনি পরামিতি জিজ্ঞাসা করার চেষ্টা করছেন।

[Parameter(Mandatory=$true)]প্যারামিটারগুলির জন্য জিজ্ঞাসা করার জন্য আপনার বৈশিষ্ট্যটি এবং সঠিক টাইপিং ব্যবহার করা উচিত ।

আপনি যদি এটি এ ব্যবহার করেন তবে [SecureString]এটি একটি পাসওয়ার্ড ক্ষেত্রের জন্য অনুরোধ করবে। আপনি যদি এটি কোনও শংসাপত্র প্রকারে ব্যবহার করেন ( [Management.Automation.PSCredential]), শংসাপত্রগুলি ডায়ালগটি পপ আপ হবে, যদি প্যারামিটারটি না থাকে। একটি স্ট্রিং কেবল একটি সরল পুরাতন পাঠ্য বাক্সে পরিণত হবে। আপনি যদি প্যারামিটার অ্যাট্রিবিউটে (অর্থাত্) হেল্পমেসেজ যুক্ত করেন [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]তবে তা প্রম্পটের জন্য সহায়তা পাঠ্যে পরিণত হবে।


5
এটি সর্বাধিক নমনীয় এবং ব্যবহারকারী-বান্ধব সমাধান, তবে আমি আপনার পরামর্শটিকে প্রায় উপেক্ষা করেছি কারণ রিন্যান্টের উত্তরের মতো কোনও পরিষ্কার কোড উদাহরণ নেই । আপনি কিছু সুন্দর বিন্যাসিত উদাহরণ প্রদান করতে পারেন?
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

4
"রিড-হোস্টটি হ'ল, খুব সহজভাবে, খারাপ ফর্ম" ... যদি না আপনি শর্তসাপেক্ষে রেখে আসা ইনপুটটি গ্রহণ করতে ব্যবহার না করেন কারণ কেউ আপনার স্ক্রিপ্টটিকে কোনও প্যারামিটার দিয়ে কল দিচ্ছে না। গম্ভীর গর্জন।

2
না: এটি তখনও খারাপ ফর্ম। এজন্য আপনি পরামিতিগুলি বাধ্যতামূলক হিসাবে চিহ্নিত করেন।
-

2
আপনি যদি একটি ইন্টারেক্টিভ স্ক্রিপ্ট লিখতে চান ? বলুন এটি একটি স্ক্রিপ্ট যা কেবলমাত্র কিছু শর্ত পূরণ করা হলে কেবল ব্যবহারকারী ইনপুট প্রয়োজন। উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টটি কোনও SDK- এর জন্য একটি লক্ষ্য ডিরেক্টরি স্থাপন করতে হয়, আপনি নিশ্চিত করতে চাইতে পারেন যে ব্যবহারকারীটি ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে মুছে ফেলতে চায়।
জেসন গোয়েমাট

6
আমি মনে করি ব্যবহারকারীর 1499731 এর একটি ভাল পয়েন্ট ছিল ... এমন সময় আসে যখন আপনি ব্যবহারকারীর কাছ থেকে ইনপুট নিতে হবে যা কিছু তথ্য প্রদর্শিত হওয়ার পরে বা অন্য কোনও ক্রিয়াকলাপ সম্পাদনের পরে কেবল অর্থবহভাবে সরবরাহ করা যেতে পারে । সেক্ষেত্রে আপনি কোনও প্যারামিটার ব্যবহার করতে পারবেন না এবং Read-Host"খারাপ ফর্ম" হওয়ার জন্য এখানে প্রদত্ত কারণগুলি প্রয়োগ করা হয় না। তদুপরি, এর .ShouldProcess()কিছু বিধিনিষেধ নেই যা Read-Hostযেমন কয়েকটি উত্তর সীমাবদ্ধ। তবে আমি সম্মত হই যে .ShouldProcess()এটি প্রযোজ্য হলেই এটি আরও ভাল।
লার্শ

14

এটি আপনার স্ক্রিপ্টের শীর্ষে রাখুন। এটি স্ক্রিপ্টটির দ্বারা ব্যবহারকারীকে একটি পাসওয়ার্ডের অনুরোধ জানাবে। ফলস্বরূপ পাসওয়ার্ডটি in pw এর মাধ্যমে আপনার স্ক্রিপ্টের অন্য কোথাও ব্যবহার করা যেতে পারে ।

   Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )

   $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))

আপনি যদি ডিবাগ করতে এবং সবেমাত্র পড়া পাসওয়ার্ডটির মান দেখতে চান তবে ব্যবহার করুন:

   write-host $pw

3

বিকল্প হিসাবে, আপনি স্ক্রিপ্ট সম্পাদনার অংশ হিসাবে ইনপুটটির জন্য এটি স্ক্রিপ্ট প্যারামিটার হিসাবে যুক্ত করতে পারেন

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.