PowerShell में उपयोगकर्ता इनपुट के लिए शीघ्र


209

मैं उपयोगकर्ता को एक पासवर्ड और फ़ाइल नाम सहित इनपुट की एक श्रृंखला के लिए संकेत देना चाहता हूं।

मेरे पास उपयोग करने का एक उदाहरण है host.ui.prompt, जो समझदार लगता है, लेकिन मैं वापसी को समझ नहीं सकता।

क्या PowerShell में उपयोगकर्ता इनपुट प्राप्त करने का एक बेहतर तरीका है?

जवाबों:


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


धन्यवाद, @Rynant केवल वही होने के लिए स्वीकृत उत्तर जिसने वास्तव में मेरे मुख्य प्रश्न का उत्तर दिया है! ;) अन्य सभी जानकारी वास्तव में बहुत उपयोगी है, खासकर जब मैं अभी भी पीएस में अपना रास्ता तैयार कर रहा हूं।
ए जे।

कोई बात नहीं, @AJ। एक विधि के बारे में जानकारी प्राप्त करने का दूसरा तरीका कोष्ठकों को छोड़ना है। मैं अपने जवाब में एक उदाहरण जोड़ूंगा।
रयानेंट

3
यदि आप उपयोगकर्ता नाम और पासवर्ड प्राप्त कर रहे हैं तो FYI करें आप Get-Credential का उपयोग कर सकते हैं।
मैट ल्योन

75

पैरामीटर बाइंडिंग का उपयोग करना निश्चित रूप से यहां जाने का तरीका है। न केवल लिखना बहुत जल्दी है (बस [Parameter(Mandatory=$true)]अपने अनिवार्य मापदंडों से ऊपर जोड़ें ), लेकिन यह एकमात्र विकल्प भी है कि आप बाद में खुद से नफरत नहीं करेंगे।

अधिक नीचे:

[Console]::ReadLinePowerShell के लिए FxCop नियमों द्वारा स्पष्ट रूप से मना किया गया है । क्यों? क्योंकि यह केवल PowerShell.exe में काम करता है, PowerShell ISE , PowerGUI , आदि में नहीं।

पढ़ें- मेजबान , काफी सरल, बुरा रूप है। Read-Host उपयोगकर्ता को संकेत देने के लिए स्क्रिप्ट को अनियंत्रित रूप से रोक देता है, जिसका अर्थ है कि आपके पास कभी भी कोई अन्य स्क्रिप्ट नहीं हो सकती है जिसमें Read-Host का उपयोग करने वाली स्क्रिप्ट शामिल है।

आप मापदंडों के लिए पूछने की कोशिश कर रहे हैं।

[Parameter(Mandatory=$true)]मापदंडों के लिए आपको विशेषता का उपयोग करना चाहिए , और टाइपिंग को सही करना चाहिए ।

यदि आप इस पर उपयोग करते हैं [SecureString], तो यह एक पासवर्ड फ़ील्ड के लिए संकेत देगा। यदि आप इसका उपयोग क्रेडेंशियल प्रकार, ( [Management.Automation.PSCredential]) पर करते हैं, तो क्रेडेंशियल संवाद पॉप अप होगा, यदि पैरामीटर नहीं है। एक स्ट्रिंग बस एक सादे पुराने पाठ बॉक्स बन जाएगा। यदि आप पैरामीटर विशेषता (वह है [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]) में एक हेल्पमेसेज़ जोड़ते हैं, तो यह प्रॉम्प्ट के लिए सहायता पाठ बन जाएगा।


5
यह सबसे अधिक लचीला और उपयोगकर्ता के अनुकूल समाधान है, लेकिन मैंने आपकी सलाह को लगभग नजरअंदाज कर दिया क्योंकि रेंटेंट के जवाब में कोई स्पष्ट कोड उदाहरण नहीं थे । आप कुछ अच्छी तरह से स्वरूपित उदाहरण प्रदान कर सकते हैं?
इयॉन सैमुअल मैकलीन एल्डर

4
"पढ़ें-होस्ट है, काफी सरल रूप से, बुरा रूप" ... जब तक आप इसे सशर्त रूप से इनपुट स्वीकार करने के लिए उपयोग नहीं कर रहे हैं जो कि छोड़ दिया गया था क्योंकि कोई भी किसी भी पैरामीटर के साथ आपकी स्क्रिप्ट को कॉल नहीं कर रहा था। बूम।

2
नहीं: यह अभी भी बुरा रूप है। इसलिए आप मानकों को अनिवार्य रूप से चिह्नित करते हैं।
स्वचालित करना

2
यदि आप एक इंटरैक्टिव स्क्रिप्ट लिखना चाहते हैं तो क्या होगा ? यह कहें कि एक स्क्रिप्ट है जिसे केवल उपयोगकर्ता इनपुट की आवश्यकता होती है यदि कुछ शर्तों को पूरा किया जाता है। उदाहरण के लिए यदि आपकी स्क्रिप्ट SDK के लिए एक लक्ष्य निर्देशिका सेट करना है, तो आप यह पुष्टि कर सकते हैं कि उपयोगकर्ता निर्देशिका हटाना चाहता है यदि यह पहले से मौजूद है।
जेसन गोएमाट

6
मुझे लगता है कि user1499731 एक अच्छा बिंदु था ... ऐसे समय होते हैं जब आपको उपयोगकर्ता से इनपुट लेने की आवश्यकता होती है जो केवल कुछ जानकारी प्रदर्शित होने या किसी अन्य ऑपरेशन के प्रदर्शन के बाद ही सार्थक रूप से प्रदान किया जा सकता है। उस स्थिति में, आप एक पैरामीटर का उपयोग नहीं कर सकते हैं, और Read-Host"खराब फॉर्म" के लिए यहां दिए गए कारण लागू नहीं होते हैं। इसके अलावा, .ShouldProcess()ऐसे प्रतिबंध हैं जो Read-Hostकेवल कुछ उत्तरों तक सीमित नहीं हैं। हालांकि मैं मानता हूं कि .ShouldProcess()यह बेहतर है, जब यह लागू हो।
लार्स

14

इसे अपनी स्क्रिप्ट के शीर्ष पर रखें। यह स्क्रिप्ट को पासवर्ड के लिए उपयोगकर्ता को संकेत देने का कारण होगा। परिणामी पासवर्ड को $ 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
      )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.