Powershell IF并且没有条件不能正常工作

时间:2018-02-27 12:59:55

标签: powershell if-statement

我努力让两个条件得到满足,不知何故似乎只有其中一个有效。我试图这样做:

如果用户已连接且未在锁定屏幕上,请求获得许可。这些命令本身已经过验证并可以单独工作,但我必须遗漏一些东西。这就是我所拥有的:

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"

}

2 个答案:

答案 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作为行继续符,允许将条件分布在多行中,使其更具可读性。
    请注意,`必须位于该行的最后