我需要一些帮助来执行一个小脚本和过滤结果...我使用以下脚本检查我的虚拟机磁盘空间
Get-VM | ForEach-Object {
$VM = $_
$_.Guest.Disks | ForEach-Object {
$Report = "" | Select-Object -Property VM,Path,Capacity,FreeSpace,PercentageFreeSpace
$Report.VM = $VM.Name
$Report.Path = $_.Path
$Report.Capacity = $_.Capacity
$Report.FreeSpace = $_.FreeSpace
if ($_.Capacity) {$Report.PercentageFreeSpace = [math]::Round(100*($_.FreeSpace/$_.Capacity))}
$report
}
} 但是我想添加一个过滤器,我的报告只显示PercentageFreeSPace小于20。
我尝试将where-object条件添加到我的报告中,但没有成功...
有人能帮帮我吗?我是PS的初学者……
提前感谢,致以最诚挚的问候
发布于 2020-09-14 16:43:22
对于将来的问题,您应该格式化您的脚本,使其更具可读性。
我相信我已经在下面做得很好了:在我的笔记本电脑上显示你的问题时,编辑似乎出了问题。在我的回答之后,格式几乎与下面提供的相同。
Get-VM | ForEach-Object {
$VM = $_
$_.Guest.Disks | ForEach-Object {
$Report = "" | Select-Object -Property VM,Path,Capacity,FreeSpace,PercentageFreeSpace $report
$Report.VM = $VM.Name
$Report.Path = $_.Path
$Report.Capacity = $_.Capacity
$Report.FreeSpace = $_.FreeSpace
if ($_.Capacity) {
$Report.PercentageFreeSpace = [math]::Round(100*($_.FreeSpace/$_.Capacity))
}
$report
}
} 老实说,我不明白为什么你要在第4行使用管道。对于你的问题,你应该在之前输入Where-Object子句,然后你将转到second for each循环。
发布于 2020-09-14 17:02:30
首先,尽量避免对foreach-object使用多个嵌套管道,而应使用foreach。也就是说,不要做
Get-VM | ForEach-Object {
$VM = $_
$_.Guest.Disks | ForEach-Object {但
foreach($vm in Get-VM) {
foreach($disk in $vm.Guest.disks) {这样就很容易看到以后处理了哪些对象,而且不需要将管道上的当前对象保存到temp变量中(这是通过$VM = $_完成的)。
此外,可以通过哈希表而不是使用select-object来初始化对象。就像这样,
$pctLimit = 20 # Variable sets percentage limit instead of a magic number
foreach($vm in Get-VM) {
foreach($disk in $vm.Guest.Disks) {
# Report object is created via hash table
$Report = new-object PSObject -Property @{
VM = $VM.Name
Path = $disk.Path
Capacity = $disk.Capacity
FreeSpace = $disk.FreeSpace
ZeroDisk = ($disk.Capacity -gt 0) # NB: calculated property
}
if (-not $Report.ZeroDisk) { # Process only non-zero disks
$Report.PercentageFreeSpace = [math]::Round(100*($Report.FreeSpace/$Report.Capacity))
if($Report.PercentageFreeSpace -lt $pctLimit) {
$report
} else {
# Disk had more than $pctLimit free space. Now what?
}
} else {
# Disk had zero capacity. Now what?
}
}
}发布于 2020-09-14 19:33:16
FIrst最重要的是感谢你的帮助
我设法使用以下内容进行过滤
Get-VM | ForEach-Object {
$VM = $_
$_.Guest.Disks | ForEach-Object {
$Report = "" | Select-Object -Property VM,Path,Capacity,FreeSpace,PercentageFreeSpace
$Report.VM = $VM.Name
$Report.Path = $_.Path
$Report.Capacity = $_.Capacity
$Report.FreeSpace = $_.FreeSpace
if ($_.Capacity) {$Report.PercentageFreeSpace = [math]::Round(100*($_.FreeSpace/$_.Capacity))}
if( $_.Capacity -and $Report.PercentageFreeSpace -lt 30 ) {
$Report
}
}
}`
谢谢,致以最良好的问候
https://stackoverflow.com/questions/63880760
复制相似问题