2017-12-19 9 views
0

eine Funktion Gegeben: function log2 {param ([double]$x) [Math]::Log($x)/[Math]::Log(2) } Warum interpretiert Powershell log2 45/120 als log2 "45/120"?

Erwartet: log2 45/120 Ausbeute -1.41503749928

Actual sollte: Cannot process argument transformation on parameter 'x'. Cannot convert value "45/120" to type "System.Double". Error: "Input string was not in a correct format." At line:1 char:6 + log2 45/120 + ~~~~~~ + CategoryInfo : InvalidData: (:) [log2], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,log2 Warum ist das so?

Uservoice

+1

kein Bug, [dies ist konstruktions] (https://docs.microsoft.com/en-us /powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-5.1) –

Antwort

0

Powershell weiß nicht, ob 45/100 als ein Argument für einen Befehl sollte ein ausgewerteter Ausdruck oder eine Zeichenfolge sein, so wählt er einen String. Damit wird das Argument für den Befehl beibehalten. Es versucht, die Zeichenfolge zu einem Double zu konvertieren, und es kann nicht, da es keine numerische Zeichenfolge ist.

Zum Beispiel habe ich den folgenden Befehl eingeben:

Get-Value 12/19/2017 

Was sollte Powershell mit 12/19/2017 tun, bevor es zu Get-Value passiert? Die sicherste Antwort ist nichts. Wenn Get-Value versuchen möchte, es zu konvertieren, ist das nicht die Aufgabe des Befehlszeilenparsers.

Ja, das sind eindeutig:

Get-Value (12/19/2017) 
Get-Value "12/19/2017" 

Aber Powershell braucht einen vernünftigen Standard haben, die alles abdeckt, und sie haben sich für alle wörtlichen Argument-Token als String zu behandeln, wenn sie als eine bezeichnet sind Ausdruck mit Klammern, ein Teilausdruck mit $() oder in einigen Fällen ein Skriptblock mit {}.

Hier ist ein weiteres Beispiel. Sagen wir, ich möchte alle Dateien mit der Erweiterung .000, die mit 4 und enden mit 1 beginnen:

Get-ChildItem 4*1.000 
Verwandte Themen