it-swarm.com.de

Aufforderung zur Benutzereingabe in PowerShell

Ich möchte den Benutzer zur Eingabe einer Reihe von Eingaben auffordern, einschließlich eines Kennworts und eines Dateinamens.

Ich habe ein Beispiel für die Verwendung von Host.ui.Prompt, was sinnvoll erscheint, aber ich kann die Rückgabe nicht verstehen.

Gibt es eine bessere Möglichkeit, Benutzereingaben in PowerShell abzurufen?

191
AJ.

Read-Host ist eine einfache Option, um Zeichenfolgen von einem Benutzer einzugeben.

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

Zum Ausblenden von Passwörtern können Sie Folgendes verwenden:

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

So konvertieren Sie das Kennwort in einfachen Text:

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

Wenn Sie für den von $Host.UI.Prompt() zurückgegebenen Typ den Code unter dem in @ Christians Kommentar angegebenen Link ausführen, können Sie den Rückgabetyp ermitteln, indem Sie ihn an Get-Member (weiterleiten. Beispiel: _$results | gm_). Das Ergebnis ist ein Dictionary, bei dem der Schlüssel der Name eines FieldDescription -Objekts ist, das in der Eingabeaufforderung verwendet wird. Um auf das Ergebnis für die erste Eingabeaufforderung im verknüpften Beispiel zuzugreifen, geben Sie Folgendes ein: _$results['String Field']_.

Wenn Sie auf Informationen zugreifen möchten, ohne eine Methode aufzurufen, lassen Sie die Klammern deaktiviert:

_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_ gibt Ihnen die Definition (en) der Methode. Jede Definition wird als <Return Type> <Method Name>(<Parameters>) angezeigt.

295
Rynant

Die Verwendung der Parameterbindung ist hier definitiv der richtige Weg. Es ist nicht nur sehr schnell zu schreiben (fügen Sie einfach [Parameter(Mandatory=$true)] über Ihren obligatorischen Parametern hinzu), sondern es ist auch die einzige Option, die Sie nicht für später hassen werden.

Weiter unten:

[Console]::ReadLine wird ausdrücklich von den FxCop Regeln für PowerShell verboten. Warum? Da dies nur in PowerShell.exe funktioniert, nicht in PowerShell ISE , PowerGUI usw.

Read-Host ist ganz einfach eine schlechte Form. Read-Host stoppt das Skript unkontrolliert, um den Benutzer zur Eingabe aufzufordern. Dies bedeutet, dass Sie niemals ein anderes Skript haben können, das das Skript enthält, das Read-Host verwendet.

Sie versuchen nach Parametern zu fragen.

Sie sollten das [Parameter(Mandatory=$true)] -Attribut verwenden und die Eingabe korrigieren, um nach den Parametern zu fragen.

Wenn Sie dies für einen [SecureString] verwenden, werden Sie zur Eingabe eines Kennwortfelds aufgefordert. Wenn Sie dies für einen Anmeldeinformationstyp ([Management.Automation.PSCredential]) verwenden, wird das Dialogfeld mit den Anmeldeinformationen angezeigt, wenn der Parameter nicht vorhanden ist. Eine Zeichenfolge wird zu einem einfachen alten Textfeld. Wenn Sie dem Parameterattribut eine Hilfemeldung hinzufügen (d. H. [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]), wird diese zu einem Hilfetext für die Eingabeaufforderung.

74

Fügen Sie dies oben in Ihr Skript ein. Das Skript fordert den Benutzer auf, ein Kennwort einzugeben. Das resultierende Passwort kann dann an anderer Stelle in Ihrem Skript über $ pw verwendet werden.

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

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

Wenn Sie debuggen möchten und den Wert des gerade gelesenen Passworts sehen möchten, verwenden Sie:

   write-Host $pw
14
user2334160

Alternativ können Sie ihn als Skriptparameter für die Eingabe im Rahmen der Skriptausführung hinzufügen

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )
3
Maverick