我有这个字符串变量:
$path = "C:Windows"
我有这个字符串数组:
$badDir = "windows",
"i3ic",
"program",
"system",
"pagefile.sys",
"system",
"swapfile.sys",
"sourcecd",
"backup",
"wwwroot",
"users",
"desktop",
"documents"
我正在尝试评估$path
是否包含数组中包含的任何字符串$badDir
其值中的任何位置。 例如,由于我的$path
值是C:Windows
,并且我的数组的一个元素是windows
,"Windows"应该匹配,下面的评估应该返回true。
$badDir -Match $path.ToLower()
但是,它返回的是假的。我在这里做错了什么?
谢谢!
我在这里做错了什么?
你测试了错误的东西,测试的方式也错了。
由于您的$path值是"C:\Windows",并且$badDir不包含"c:\windows"并且不包含(包含"c:\windows"的字符串(,因此计算应返回 false
如果你不想使用正则表达式,你需要循环$badDir并测试每个项目,然后查看结果:
$path = "C:Windows"
$badDir = "windows",
"i3ic",
"program",
"system",
"pagefile.sys",
"system",
"swapfile.sys",
"sourcecd",
"backup",
"wwwroot",
"users",
"desktop",
"documents"
$badDirmatch = $badDir.Where({$path.ToLower().contains($_)}, 'First').Count -as [bool]
.Where()
比| Where-Object
快,"第一个"截止将让它在比赛中立即停止,而不是测试所有其他元素。
$badDir -Match $path.ToLower()
会将"C:\Windows"与$baddir
的每个元素进行比较。由于这些都不是匹配项,这就是您获得错误的原因。该操作也很混乱,因为您的模式字符串包含正则表达式。然而,无论如何这不是你想要的。
很确定您需要将$baddir
的每个元素单独与$path
进行比较。我不知道有一个运算符会像您在这里期望的那样进行惰性匹配
($badDir | ForEach-Object{$path -match [regex]::Escape($_)}) -contains $true
$badDir
元素包含正则表达式元字符,因此我们需要转义这些元字符以获得真正的匹配。然后我们只检查生成的布尔数组是否包含任何真正的元素。把它拍到if块或管道中,你应该能够得到你想要的结果。
根据您的实际实现,还有其他方法可以解决这个问题,但以上应该足够了。
没有正则表达式
标题说没有正则表达式,所以让我们调整上面的内容以删除该方法的那部分。逻辑还是一样
($badDir | ForEach-Object{$path.ToLower().IndexOf("$_".ToLower()) -ge 0}) -contains $true
检查一个字符串是否位于另一个字符串中。如果有,我们评估为布尔值,就像之前一样,检查其中一个结果是否为真。