powershell - 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 语句时,我实际上并没有得到任何输出。
非常感谢你的帮助 !
解决方案
仅使用( )
Format-*
等 cmdlet进行显示格式化;如果必须以编程方式处理ft
Format-Table
数据,切勿使用它们。Format-*
cmdlet 输出格式化指令,而不是数据- 请参阅此答案。即使
| ft -autosize
已删除,也不应$open
与$true
or$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-Object
cmdlet 未在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
位于布尔上下文中。
推荐阅读
- javascript - 是否可以像使用 graphql 查询一样仅查询 DataStore 查询中的某些字段?
- debugging - VSCode 调试:访问 chrome 已经打开的 tabs-urls
- javascript - 客户端文件未正确导入 discordjs
- c# - 具有 Linq 和默认值的多个左连接
- rest - 如何在docker上的pyspark中提交一个rest api jar
- python - Django 模板标签 all() 和 count() 不起作用我该怎么办
- java - Java JPA 类型查询
- kubernetes - 有没有办法让 kustomize 将文件的内容合并到 yaml 文件中?
- visual-c++ - VC++如何获取窗口所属主程序的名称?
- c# - 无法找到用于 64x 平台的库 teseract41.dll - 安装 vc_redist.x64.exe 后