检查数组的项是否包含在字符串中,而不在 PowerShell 中使用正则表达式



我有这个字符串变量:

$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

检查一个字符串是否位于另一个字符串中。如果有,我们评估为布尔值,就像之前一样,检查其中一个结果是否为真。

最新更新