Powershell if 语句

Powershell if statement

在我的一台服务器中,我们有一个需要每月更新的程序,该程序在终端服务器上运行。

我的基本脚本运行正常(非常简单):


Get-SmbOpenFile |where {$_.Path -eq "D:\Shares\Programs\test.exe"} |select ClientUserName, path |ft -autosize

pause

但我正在努力让它变得更多 "smarter" 所以我尝试使用 IF 语句:

第一次测试:

$open = Get-SmbOpenFile |where {$_.Path -eq "D:\Shares\Programs\test.exe"} |`
select ClientUserName, path |ft -autosize



if ($open -eq "true")
{ write-host "showing open files"
}

elseif ($open -eq "false")
{ "All cloesd"
}

pause

第二次测试:

$open = Get-SmbOpenFile |where {$_.Path -eq "D:\Shares\Programs\test.exe"} |`
select ClientUserName, path |ft -autosize


if ($open -eq $true)
{
 write-host "showing open files"
}

elseif ($open -eq $false)
{ 
"All cloesd"
}

我也试过这样定义变量:

$open = Get-SmbOpenFile |where {$_.Path -eq "D:\Shares\Programs\test.exe"} 

当我使用 IF 语句时,我实际上没有得到任何输出。

非常感谢您的帮助!

  • 仅使用 Format-* cmdlet,例如 ft (Format-Table) 显示格式;如果数据必须 以编程方式处理 ,则切勿使用它们。 Format-* cmdlet 输出 格式化说明 ,而不是 数据 - 请参阅 this answer.

  • 即使删除了 | ft -autosize你也不应该将 $open$true$false[=104= 进行比较],因为如果 LHS 还不是 Boolean(类型 [bool][1][=,这样的显式比较通常不会按预期工作110=];相反,利用 PowerShell 的隐式 到布尔转换 - 请参阅 .

    [= 的底部部分107=]
  • 您的 if 分支实际上 输出 $open;它只向显示器输出 Write-Host 状态消息。

将它们放在一起:

$open = Get-SmbOpenFile | 
          Where-Object {$_.Path -eq "D:\Shares\Programs\test.exe"} |
            Select-Object ClientUserName, Path

if ($open) {
  Write-Host "showing open files"
  $open  # output the result
}
else {
  Write-Host "all closed"
}

Select-Object returns:

  • a [pscustomobject]实例[2](具有属性.ClientUserName.Path的自定义对象)

    • 任何 [pscustomobject] 实例 - 无论其结构如何 - 在布尔上下文中计算为 $true
  • 或 "nothing"(技术上,[System.Management.Automation.Internal.AutomationNull]::Value),如果 Where-Object cmdlet 在 Get-SmbOpenFile 的输出中没有找到指定的路径.

    • "Nothing" 在布尔上下文中计算为 $false

同样,请参阅 的底部部分以了解隐式到布尔转换的完整规则集。


[1] 值得注意的是,与 $true 相比,作为 LHS 的非原始对象总是产生 $false(尽管操作数没有反转);例如,(Get-Item /) -eq $true;此外,任何不完全是 1 的非零数字都将表示 $false;例如:2 -eq $true。此外,使用 array-valued LHS,-eq 充当 filter,returns 匹配项的子数组(例如,(1, 2, 1) -eq $true returns 1, 1

[2] 一般来说,Select-Object 可以 return 多个 个对象,在这种情况下 $open 会收到[object[]] 类型的 数组 [pscustomobject] 个实例。具有 2 个或更多元素的数组在布尔上下文中总是 $true