Powershell比较if结构中的字符串会产生错误的结果

时间:2016-06-29 13:40:39

标签: powershell

Simple Powershell脚本:

$key = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager"
$bootexecute = $key.BootExecute

write-host $bootexecute

if ($bootexecute -eq "autocheck autochk *") {
    return $false
} else {
    return $true
}

这就是我得到的输出:

  

autocheck autochk / r \ ?? \ C:autocheck autochk *
  假

所以即使$ bootexecute变量不完全等于“autocheck autochk *”,我仍然会得到“False”,而它应该返回“True”。

发生了什么事,我在这里错过了什么?

编辑,澄清:我真的想检查字符串“autocheck autochk *”。包括星号。

3 个答案:

答案 0 :(得分:2)

您的-eq条件不是您想要的。

您正在对长字符串进行相等比较,并且部分匹配始终为false。你可能真的想要一个通配符,如。

$bootexecute -like "autocheck autochk *"

那应该得到你想要的。 然而如果您尝试匹配字符串文字,那么-like就不会好。我错误地认为您使用的是通配符。

关键是-eq不起作用,因为字符串还有更多,然后只是" autocheck autochk *"。

请考虑以下内容,以说明-eq失败的原因"

"autocheck autochk *" -eq "autocheck autochk *"
True

"autocheck autochk /r \??\C: autocheck autochk *" -eq "autocheck autochk *"
False

使用数组

作为pointed out by Tony in comments,您将返回一个数组。当被视为字符串时,PowerShell会用空格对其进行连接,这就是write-host显示它的原因。因为您知道正在测试数组运算符-contains的完整元素在这里更有意义。

$bootexecute -contains "autocheck autochk *"

查看注册表,您会看到BootExecute是一个REG_MULTI_SZ,因此可以获得一个数组。

答案 1 :(得分:2)

由于$bootexecute正在评估:

  

autocheck autochk / r \ ?? \ C:autocheck autochk *

-eq可能不是你想要的。

相反,请使用正则表达式和-match

if ($bootexecute -match "autocheck autochk .*") {
    return $false
} else {
    return $true
}

可以简化为:

$bootexecute -match "autocheck autochk .*"
return

答案 2 :(得分:1)

从get-itemproperty返回一个字符串数组,因此$bootexecute是一个数组。 if语句的计算结果为true,因为数组中的某个项等于指定的字符串。

如果您只想比较数组中的第一项,可以将if语句更改为:

if ($bootexecute[0] -eq "autocheck autochk *")

如果您想要比较所有这些(这是发布的代码正在做的事情),您可以使用.contains来使代码更清晰:

if ($bootexecute.contains("autocheck autochk *"))