我努力让两个条件得到满足,不知何故似乎只有其中一个有效。我试图这样做:
如果用户已连接且未在锁定屏幕上,请求获得许可。这些命令本身已经过验证并可以单独工作,但我必须遗漏一些东西。这就是我所拥有的:
if (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem | Select-Object -expandproperty UserName -and -not (get-process -ComputerName $poste -name logonui)) {
"ask for permission"
}
现在它只是没有进入这个代码,它会跳到其他地方正在发生的下半部分。
我的语法有什么问题?
我可以解决这个问题,并从我的CMD时代开始以这种老式的方式运作:
Clear-Variable -name statut_user
$statut_user -eq 0
if (Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem | Select-Object -expandproperty UserName) {$statut_user +=1}
if (-not (get-process -ComputerName $poste -name logonui)) {$statut_user += 1}
if ($statut_user -eq 2) {
"ask for permission"
}
它有效,但不如具有这两个条件的适当的一个衬垫那么干净。谢谢你的帮助!
答案编辑:感谢vonPryz的回答,我最终使用了:
$utilisateur = Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem | Select-Object -expandproperty UserName
$ecran_verr = get-process -ComputerName $poste -name logonui
if( -not ($ecran_verr) -and ($utilisateur)) {
"ask for permission"
}
答案 0 :(得分:2)
目标是清晰,而不是小代码库大小。而不是在if
语句中进行WMI调用并管理结果,而是考虑更具可读性的内容。像这样,
$cs = gwmi -computername $p Win32_ComputerSystem
$uname = $cs | select-object -expandproperty UserName
$logonui = get-process -ComputerName $p -name logonui
if( -not ($logonui) -and ($uname )) {
# Stuff
}
这种方法可以很容易地检查WMI对象是否包含合理的值,无论这些值是什么。然后编写简洁的条件语句应该更容易。
答案 1 :(得分:2)
虽然将表达式分解为多个步骤始终是调试的好主意,如vonPryz's helpful answer中所示,有时您确实需要单个表达式的简洁而没有辅助变量。
我的语法有什么问题?
您在(...)
渠道周围缺少Get-WmiObject ... | Select-Object ...
。
要将命令或管道用作较大表达式的一部分,您必须始终将其括在(...)
A < PowerShell中的em> command 是对可执行文件的调用 - 无论是cmdlet,函数,别名还是外部程序。
一个简单的例子:
# !! BROKEN: tokens `-eq 'jdoe'` are interpreted as *arguments for Select-Object*
# !! rather than as operator -eq and RHS 'jdoe'
if (Get-WmiObject Win32_ComputerSystem | Select-Object -Expand UserName -ne 'jdoe') {
'not jdoe'
}
# OK: (...) around the pipeline properly embeds it in the overall expression:
if ((Get-WmiObject Win32_ComputerSystem | Select-Object -Expand UserName) -ne 'jdoe') {
'not jdoe'
}
这是原始命令的固定版本,修复了其他方面的改进:
if (
(Get-WmiObject –ComputerName $poste –Class Win32_ComputerSystem).UserName `
-and -not `
(Get-Process -ErrorAction SilentlyContinue -ComputerName $poste -name logonui)
) {
"ask for permission"
}
鉴于您的Get-WmiObject
调用仅输出 1 对象,您可以直接访问.UserName
属性,这也比管道{{{1}更有效。 1}}。
Select-Object -ExpandProperty
会输出非终止错误,因此Get-Process
会对此进行抑制。
注意使用-ErrorAction SilentlyContinue
作为行继续符,允许将条件分布在多行中,使其更具可读性。
请注意,`
必须位于该行的最后。