在我的其中一台服务器中,我们有一个程序,每个月需要更新一次,该程序在终端服务器上运行。
我的基本脚本正在运行(非常简单):
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语句时,实际上根本没有任何输出。
非常感谢你的帮助 !
仅使用(()Format-*
等cmdlet进行显示格式设置; 如果必须以编程方式处理数据,则不要使用它们ft
Format-Table
。Format-*
cmdlet输出格式说明,而不是数据-请参阅此答案。
即使| ft -autosize
已删除,也不应$open
与$true
或进行比较$false
,因为如果LHS还不是布尔型(type [bool]
)[1],则这样的显式比较通常将无法按预期进行。相反,请利用PowerShell的隐式to-Boolean转换-请参阅此答案的底部。
您的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-Object
cmdlet在Get-SmbOpenFile
的输出中找不到指定的路径。
$false
在布尔上下文中,“ Nothing”的计算结果为。同样,请参见此答案的底部,以获取有关隐式到布尔转换的完整规则集。
[1]值得注意的是,与LHS$false
相比,LHS总是产生非原始对象$true
(尽管操作数取反);例如(Get-Item /) -eq $true
;同样,任何非零的数字也不完全1
表示$false
;例如:2 -eq $true
。另外,使用数组值的LHS-eq
充当过滤器,返回匹配项的子数组(例如,(1, 2, 1) -eq $true
return)1, 1
。
[2]通常,Select-Object
可以返回多个对象,在这种情况下$open
将接收[object[]]
-typed阵列的[pscustomobject]
实例。具有2个或更多元素的数组始终 $true
处于布尔上下文中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句