
Я хочу извлечь доступное дисковое пространство из нескольких серверов и пометить значения с низким дисковым пространством (<20 ГБ для примера). У меня возникли проблемы с пометкой низких значений.
Чтобы освободить место на диске, я запускаю
$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.