Powershell if语句
在我的一台服务器上,我们有一个程序,每个月都需要更新,这个程序在终端服务器上运行 我的基本脚本正在运行(非常简单): 但我正试图让它更“聪明”,所以我尝试使用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
$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
)进行显示格式设置;如果必须以编程方式处理数据,则切勿使用它们。格式表
cmdlet输出格式化指令,而不是数据-请参阅Format-*
- 即使删除了
,您也不应该将| ft-autosize
与$open
或$true
进行比较,因为如果LHS还不是布尔值(type$false
)[1],这种显式比较通常不会按预期工作;相反,利用PowerShell的隐式到布尔的转换——请参阅[bool]
- 如果分支没有实际输出
,则您的$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"
}
选择对象
返回以下任一项:
- 一个
实例[2](具有属性[pscustomobject]
和.ClientUserName
的自定义对象).Path
- 任何
实例-无论其结构如何-在布尔上下文中计算为[pscustomobject]
$true
- 任何
- 或者如果
cmdlet在Where Object
的输出中未找到指定路径,则为“nothing”(从技术上讲,Get SmbOpenFile
)[System.Management.Automation.Internal.AutomationNull]::Value
- 在布尔上下文中,“Nothing”的计算结果为
$false
- 在布尔上下文中,“Nothing”的计算结果为
[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"
}