6

これは私の現在のスクリプトがどのように見えるかです:

$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file

ファイルの出力は次のとおりです。

@{LoadPercentage=4}

計算できるように数字だけにしてほしい。

4

2 に答える 2

12

qbanet359 の役立つ回答では、結果オブジェクトで直接プロパティ アクセス( ) を使用.LoadPercentageしています。これは、この場合、最も単純で最も効率的なソリューションです。

PowerShell v3 以降では、メンバー列挙と呼ばれる機能を使用して、オブジェクトのコレクションからプロパティ値を抽出する場合でも機能します。

たとえば、2019 年に実行すると、配列内の各インスタンスのプロパティ値であるand((Get-Date), (Get-Date).AddYears(-1)).Yearが返されます。20192018.Year[datetime]


大きな入力コレクションitem を item ごとに処理する場合などSelect-Object、(またはその組み込みエイリアス)を使用したい場合:select

を使用Select-Objectして単一のプロパティを抽出するには、次を使用する必要があります-ExpandProperty

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

背景:

Select-Objectデフォルトでは 、パラメータを介して指定したプロパティを持つカスタム オブジェクト([pscustomobject]インスタンス[1]-Property ) を作成します (オプションで、第 1 引数として暗黙的に)。

これは、単一のプロパティ[2]を指定する場合にも適用されるため、select LoadPercentage(略して: Select-Object -Property LoadPercentage) は次のオブジェクトのようなものを作成します。

$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4

Add-Contentログ ファイルへの書き込みを使用しているため.ToString()、展開可能な文字列でオブジェクトを使用した場合 (try "$([pscustomobject] @{ LoadPercentage = 4 })") と同様に、書き込まれるのはそのカスタム オブジェクトの文字列表現です。

対照的に、単一のプロパティにのみ-ExpandProperty適用できるparameter は、カスタム オブジェクトを作成せ、代わりに入力オブジェクトからそのプロパティの値を返します。

  • 注: そのプロパティの値がたまたま配列(コレクション) である場合、その要素は個別に出力されます。つまり、入力オブジェクトごとに複数の出力が得られます。

[1] 厳密に言えば、それらは[System.Management.Automation.PSCustomObject]インスタンスです。タイプ アクセラレータは、紛らわしいことに、歴史的な理由[pscustomobject]からタイプを指します。この GitHub の問題[System.Management.Automation.PSObject]を参照してください。

[2] GitHubSelect-Objectでは、単一のプロパティのみを使用して のデフォルトの動作を変更するという、熱く議論されている要求があります。議論は興味深いものですが、現在の動作が変わる可能性は低いです。

于 2018-02-15T14:13:38.707 に答える