2017-12-19 9 views
0

は、機能を考える: function log2 {param ([double]$x) [Math]::Log($x)/[Math]::Log(2) } Powershellがlog2 45/120をlog2 "45/120"と解釈するのはなぜですか?

予想: 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 は、なぜそれがある:log2 45/120実際-1.41503749928

得なければなりませんか?

Uservoice

+1

ないバグ、[これは仕様によるもの](https://docs.microsoft.com/en-us /powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-5.1) –

答えて

0

45/100場合、それは文字列を選択したように、コマンドの引数は、評価された式または文字列であると考えられるようPowerShellは知りません。これは、コマンドの引数を保持するためです。文字列をdoubleにキャストしようとします。数値文字列ではないため、文字列をdoubleにキャストしようとしません。

例えば、私は、次のコマンドを入力します。それはGet-Valueにそれを渡す前に

Get-Value 12/19/2017 

はPowerShellが12/19/2017で何をすべき?最も安全な答えはで、何もです。 Get-Valueがそれを変換しようとすると、それはコマンドラインパーサーの仕事ではありません。

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

しかし、PowerShellは、すべてをカバー賢明なデフォルトを持っている必要があり、彼らは次のように指定していない限り、文字列として、すべてのリテラル引数トークンを処理するために選択した:

はい、これらは明示されています括弧付きの式、$()の部分式、場合によっては{}のスクリプトブロックなどがあります。

もう1つの例です。のは、私が4で始まり、1で終わる.000の拡張子を持つすべてのファイルをしたいとしましょう:

Get-ChildItem 4*1.000 
関連する問題