Powershell 将If语句与管道命令一起使用

Powershell 将If语句与管道命令一起使用,powershell,Powershell,一般来说,我对使用PowerShell和计算机编程是完全陌生的。我试图创建一个脚本,如果进程超过10mb的工作集,它将终止进程(本例中为firefox)。我希望使用if语句并包含piping命令来完成此操作。到目前为止,我有: get-process|where-object {$_.ProcessName -eq"firefox"} if ($_.WorkingSet -gt10000000) {kill} else {"This process is not us

一般来说,我对使用PowerShell和计算机编程是完全陌生的。我试图创建一个脚本,如果进程超过10mb的工作集,它将终止进程(本例中为firefox)。我希望使用if语句并包含piping命令来完成此操作。到目前为止,我有:

get-process|where-object {$_.ProcessName -eq"firefox"}

if ($_.WorkingSet -gt10000000)
      {kill}
else
       {"This process is not using alot of the computers resources"}

有人能帮忙解决这个问题吗?即使firefox的工作集超过10MB,else语句也会一直被复制。

您需要将条件封装在一个循环中:

Get-Process | ? { $_.ProcessName -eq 'firefox' } | % {
  if ($_.WorkingSet -gt 10MB) {
    kill $_
  } else {
    "This process is not using alot of the computers resources"
  }
}

否则,将独立于管道对条件进行求值,这意味着当前对象变量(
$)\u
在该点将为空。

您需要将条件包装在循环中:

Get-Process | ? { $_.ProcessName -eq 'firefox' } | % {
  if ($_.WorkingSet -gt 10MB) {
    kill $_
  } else {
    "This process is not using alot of the computers resources"
  }
}

否则,该条件将独立于管道进行计算,这意味着当前对象变量(
$\u
)将在该点为空。

您可以通过使用Name参数筛选有问题的流程(无需为此使用
Where object
)然后将对象通过管道传输到
Stop进程
cmdlet。请注意
-WhatIf
开关,它显示了如果cmdlet运行(cmdlet未运行)会发生什么情况。删除它以执行cmdlet

Get-Process -Name firefox | 
Where-Object {$_.WorkingSet -gt 10mb} | 
Stop-Process -WhatIf

您可以通过使用Name参数(无需为此目的使用
Where Object
)来过滤有问题的进程,然后将对象通过管道传输到
Stop process
cmdlet。请注意
-WhatIf
开关,它显示了如果cmdlet运行(cmdlet未运行)会发生什么情况。删除它以执行cmdlet

Get-Process -Name firefox | 
Where-Object {$_.WorkingSet -gt 10mb} | 
Stop-Process -WhatIf

+1.我对两个答案都投了赞成票,但这确实是一种处理此类情况的更为强大的方式。如果可以的话,我会给这个打+2分。:)+1.我对这两个答案都投了赞成票,但这确实是一种处理此类情况的更为强大的方式。如果可以的话,我会给这个打+2分。:)