Powershell在if结构中比较字符串时得出错误结果

Powershell在if结构中比较字符串时得出错误结果,powershell,Powershell,简单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 } 这是

简单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
}
这是我得到的输出:

自动检查autochk/r\??\C:autocheck autochk*
假的

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

发生了什么事,我错过了什么

编辑,澄清一下:我确实想检查字符串“autocheck autochk*”。包括星号。

您的-eq条件不是您想要的。 您正在对一个长字符串进行相等的比较,其中的部分匹配将始终为false。实际上,您可能需要一个通配符,如

$bootexecute -like "autocheck autochk *"
那应该会得到你想要的。但是,如果您试图匹配字符串文字,那么像
-like
就不好了。我错误地认为您使用的是通配符

关键是
-eq
不起作用,因为字符串的内容比“autocheck autochk*”多

考虑以下内容以说明
-eq
为何“失败”


使用阵列 当您得到返回的数组时。当被视为字符串时,PowerShell将其与空格连接,这就是为什么
write host
显示它是什么。因为您知道要测试的数组运算符
-contains
的完整元素,所以在这里更有意义

$bootexecute -contains "autocheck autochk *"

查看注册表,您会发现BootExecute是一个REG_MULTI_SZ,因此需要获得一个数组。

因为
$BootExecute
的计算结果是:

自动检查autochk/r\??\C:自动检查autochk*

-eq
可能不是您想要的

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

if ($bootexecute -match "autocheck autochk .*") {
    return $false
} else {
    return $true
}
可以简化为:

$bootexecute -match "autocheck autochk .*"
return

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

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

if ($bootexecute[0] -eq "autocheck autochk *")
如果您想比较所有这些代码(这就是发布的代码所做的),可以使用
.contains
使代码更清晰:

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

$bootcexecute | get Member会得到什么?
$bootcexecute
将作为字符串数组返回,顺便说一句。@tire0011:TypeName:System。String@TonyHinkle:你说得对,这是一个数组。如果我将$bootexecute更改为$bootexecute[0],它将完全按照预期工作。你能把它作为一个答案,这样我就可以接受它了吗。我是个白痴。。。。。我用管道把它输入GM,但忘了使用inputobject。它是一个字符串数组。不过,我有一个比这里建议的更好的解决方案。>星号被逐字解释得很好,这就是我想要的,因为它确实在那里。不。正在比较整个字符串。您的字符串还包含其他数据。你是在寻找一个匹配的字符串结尾吗?哦。。。关于你使用的条件不正确,我是对的。我得到了您需要的一个错误,似乎您得到了一个返回的数组。在这种情况下,这不重要,但我非常确定
.contains()
方法区分大小写。
if ($bootexecute.contains("autocheck autochk *"))