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 *”。包括星号。
答案 0 :(得分:2)
您正在对长字符串进行相等比较,并且部分匹配始终为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 *"))