配列内の値を修正する

配列内の値を修正する

複数のサーバーから使用可能なディスク容量を取得し、ディスク容量が少ない値 (たとえば 20 GB 未満) にフラグを設定したいと考えています。低い値にフラグを設定するのに問題があります。

ディスクスペースを引き出すには、

$Array = gwmi win32_logicaldisk -ComputerName ComputerName | Select DeviceId, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}} 

期待どおりにデータを返します。

DeviceId Size FreeSpace
-------- ---- ---------
A:          0         0
C:       79.9      14.3
D:        701     72.76
Z:          0         0

次に、$Array.Freespace に対して次のクエリを実行します。

0
14.3
72.76
0

このリスト内の 20 未満の値にフラグを付けたいので、以下のコードを実行してみました。

ForEach ($Value IN $Array.FreeSpace)
{IF ($Value -lt 20) {$Value = "WARNING"}

ただし、これを実行した後、配列には変更がありません。問題は$Value = "Warning"、ForEach ループ内の個々の値を変更する正しい方法であるかどうかにあると思います。

最終結果として、クエリを実行したときに以下の結果が表示されるようにします$Array

DeviceId Size FreeSpace
-------- ---- ---------
A:          0     WARNING
C:       79.9     WARNING
D:        701     72.76
Z:          0     WARNING

どのような助けでも大歓迎です。ありがとうございます。

答え1

あなたがしようとしている方法では配列のサブ項目を設定できないと思います。代わりにこの方法を試してください。

> $Array = gwmi win32_logicaldisk -ComputerName ComputerName | Select DeviceId, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}}

> $array.freespace
144.56
146.88
0
2198.05

> foreach ($Drive in $Array) {IF ($Drive.Freespace -lt 20) {$Drive.Freespace = "WARNING"}}

> $array.freespace
144.56
146.88
WARNING
2198.05

> $array

DeviceId    Size FreeSpace
--------    ---- ---------
C:        220.26    144.56
D:        244.14    146.88
E:             0   WARNING
P:       3071.87   2198.05

Freespace 値を参照して各項目を処理します。

関連情報