Powershell在if结构中比较字符串时得出错误结果
简单Powershell脚本: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 } 这是
$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 *"))