Powershell if语句

Powershell if语句,powershell,powershell-4.0,Powershell,Powershell 4.0,在我的一台服务器上,我们有一个程序,每个月都需要更新,这个程序在终端服务器上运行 我的基本脚本正在运行(非常简单): 但我正试图让它更“聪明”,所以我尝试使用IF语句: 第一次测试: $open = Get-SmbOpenFile |where {$_.Path -eq "D:\Shares\Programs\test.exe"} |` select ClientUserName, path |ft -autosize if ($open -eq "true") { write-host

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

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

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

非常感谢你的帮助

  • 仅使用
    格式-*
    cmdlet,如
    ft
    格式表
    )进行显示格式设置;如果必须以编程方式处理数据,则切勿使用它们
    Format-*
    cmdlet输出格式化指令,而不是数据-请参阅

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

  • 如果分支没有实际输出
    $open
    ,则您的
    ;它仅向显示器输出
    写入主机
    状态消息

总而言之:

$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"
}
选择对象
返回以下任一项:

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

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

    • 在布尔上下文中,“Nothing”的计算结果为
      $false
同样,有关隐式到布尔转换的完整规则集,请参见的底部部分


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


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

我很感激您的反馈,@RoadRunner。
$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"
}