首页 > 解决方案 > Powershell if 语句

问题描述

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

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


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

pause

但我试图让它更“聪明”,所以我尝试使用 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 语句时,我实际上并没有得到任何输出。

非常感谢你的帮助 !

标签: powershellpowershell-4.0

解决方案


  • 仅使用( )Format-*等 cmdlet进行显示格式化;如果必须以编程方式处理ftFormat-Table数据,切勿使用它们。 Format-*cmdlet 输出格式化指令,而不是数据- 请参阅此答案

  • 即使| ft -autosize已删除,也不应$open$trueor$false进行比较,因为如果 LHS 还不是Boolean (type [bool]) [1] ,这种显式比较通常不会按预期工作;相反,利用 PowerShell 的隐式到布尔转换- 请参阅此答案的底部部分。

  • 您的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返回:

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

    • 任何[pscustomobject]实例(无论其结构如何)都$true在布尔上下文中求值。
  • 或“无”(从技术上讲,是[System.Management.Automation.Internal.AutomationNull]::Value),如果Where-Objectcmdlet 未在Get-SmbOpenFile的输出中找到指定的路径。

    • “无”$false在布尔上下文中计算。

同样,有关隐式到布尔转换的完整规则集,请参阅此答案的底部部分。


$false[1] 值得注意的是,与 LHS相比,非原始对象总是产生$true(尽管没有反转操作数);例如,(Get-Item /) -eq $true; 此外,任何不准确的非零数字都1将指示$false;例如:2 -eq $true。此外,使用数组值LHS,-eq充当过滤器,返回匹配项的子数组(例如,(1, 2, 1) -eq $true返回1, 1.

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


推荐阅读