问题 PowerShell:如果构建正确的话怎么办?


我正在尝试学习powershell并试图构造一个if else语句:

if ((Get-Process | Select-Object name) -eq "svchost") {
    Write-Host "seen"
    }
    else {
    Write-Host "not seen"
    }

尽管存在svchost流程,但最终会变成“未见”。如何修改以获得正确的结果?


5327
2017-10-03 06:07


起源



答案:


你的if-else结构是完美的,但改变if条件如下:

(Get-Process | Select-Object -expand name) -eq "svchost"

最初,您将对象与“svchost”进行比较,后者将评估为false。随着 -expandProperty flag,你得到的是对象的属性,这是一个字符串,可以正确地与“svchost”进行比较。

请注意,在上面您要比较包含进程名称的字符串数组到“svchost”。在阵列的情况下 -eq 如果数组包含另一个表达式,则为true,在本例中为“svchost”

还有其他“更好”的方法来检查:

if (Get-Process | ?{ $_.Name -eq "svchost"}) {
  Write-Host "seen"
}
else {
  Write-Host "not seen"
}

10
2017-10-03 06:23





您可以简单地询问Get-Process以获得您所追求的流程:

if (Get-Process -Name svchost -ErrorAction SilentlyContinue) 
{
  Write-Host "seen"
}
else 
{
  Write-Host "not seen"
}

2
2017-10-03 07:18



但如果没有进程,那将会出错。这就是我没有建议的原因。或者使其复杂化 silentlycontinue - manojlds
我本应该补充一下。无论如何,这是将用户引入ErrorAction选项的另一种方法。 - Shay Levy
对于尚未习惯的人的暗示: -ErrorAction SilentlyContinue 可以缩写为 -ea 0。如果您需要,非常适合打高尔夫球和互动使用。但是,不要在脚本中使用它。 - Joey


答案:


你的if-else结构是完美的,但改变if条件如下:

(Get-Process | Select-Object -expand name) -eq "svchost"

最初,您将对象与“svchost”进行比较,后者将评估为false。随着 -expandProperty flag,你得到的是对象的属性,这是一个字符串,可以正确地与“svchost”进行比较。

请注意,在上面您要比较包含进程名称的字符串数组到“svchost”。在阵列的情况下 -eq 如果数组包含另一个表达式,则为true,在本例中为“svchost”

还有其他“更好”的方法来检查:

if (Get-Process | ?{ $_.Name -eq "svchost"}) {
  Write-Host "seen"
}
else {
  Write-Host "not seen"
}

10
2017-10-03 06:23





您可以简单地询问Get-Process以获得您所追求的流程:

if (Get-Process -Name svchost -ErrorAction SilentlyContinue) 
{
  Write-Host "seen"
}
else 
{
  Write-Host "not seen"
}

2
2017-10-03 07:18



但如果没有进程,那将会出错。这就是我没有建议的原因。或者使其复杂化 silentlycontinue - manojlds
我本应该补充一下。无论如何,这是将用户引入ErrorAction选项的另一种方法。 - Shay Levy
对于尚未习惯的人的暗示: -ErrorAction SilentlyContinue 可以缩写为 -ea 0。如果您需要,非常适合打高尔夫球和互动使用。但是,不要在脚本中使用它。 - Joey