问题描述
我需要一些帮助来执行一些脚本并过滤结果... 我使用以下脚本检查我的VM磁盘空间
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的初学者...
预先感谢, 最好的问候
解决方法
对于以后的问题,您应该格式化脚本以使其更具可读性。
我相信我在以下方面做得很好: [编辑]好像在我的笔记本电脑上显示您的问题时出了点问题。在我回答完之后,格式几乎与下面提供的格式相同。
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子句。对于每个循环,您都将使用秒。
,首先,请尝试避免使用多个嵌套管道来连接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 = $_
执行此操作)。
此外,可以通过哈希表而不是选择对象来初始化对象。像这样
$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?
}
}
}
,
首先感谢您的帮助
我设法用以下内容过滤
Get-VM | ForEach-Object {
$VM = $_
$_.Guest.Disks | ForEach-Object {
$Report = "" | Select-Object -Property VM,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
}
}
}
`
谢谢, 最好的问候