首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >forEach循环中的Powershell - Where-Object

forEach循环中的Powershell - Where-Object
EN

Stack Overflow用户
提问于 2020-09-14 16:31:38
回答 3查看 1.1K关注 0票数 0

我需要一些帮助来执行一个小脚本和过滤结果...我使用以下脚本检查我的虚拟机磁盘空间

代码语言:javascript
复制
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的初学者……

提前感谢,致以最诚挚的问候

EN

回答 3

Stack Overflow用户

发布于 2020-09-14 16:43:22

对于将来的问题,您应该格式化您的脚本,使其更具可读性。

我相信我已经在下面做得很好了:在我的笔记本电脑上显示你的问题时,编辑似乎出了问题。在我的回答之后,格式几乎与下面提供的相同。

代码语言:javascript
复制
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循环。

票数 0
EN

Stack Overflow用户

发布于 2020-09-14 17:02:30

首先,尽量避免对foreach-object使用多个嵌套管道,而应使用foreach。也就是说,不要做

代码语言:javascript
复制
Get-VM | ForEach-Object {
  $VM = $_
  $_.Guest.Disks | ForEach-Object {

代码语言:javascript
复制
foreach($vm in Get-VM) {
  foreach($disk in $vm.Guest.disks) {

这样就很容易看到以后处理了哪些对象,而且不需要将管道上的当前对象保存到temp变量中(这是通过$VM = $_完成的)。

此外,可以通过哈希表而不是使用select-object来初始化对象。就像这样,

代码语言:javascript
复制
$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?
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-14 19:33:16

FIrst最重要的是感谢你的帮助

我设法使用以下内容进行过滤

代码语言:javascript
复制
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
}
} 

}

`

谢谢,致以最良好的问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63880760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档