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

检查数组项是否包含在字符串中,而不在PowerShell中使用正则表达式,powershell,Powershell,我有一个字符串变量: $path = "C:\Windows" 我有以下字符串数组: $badDir = "windows", "i3\ic", "program", "system", "pagefile.sys", "system", "swapfile.sys", "sourcecd", "backup", "wwwroot",

我有一个字符串变量:

$path = "C:\Windows"
我有以下字符串数组:

$badDir = "windows",
        "i3\ic",
        "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()
然而,它返回false。我在这里做错了什么


谢谢

$badDir-Match$path.ToLower()
会将“C:\Windows”与
$badDir
的每个元素进行比较。因为这些都不是匹配项,所以你会变得错误。由于模式字符串包含正则表达式,因此操作也很混乱。然而,无论如何,这不是你想要的

非常确定您需要将
$baddir
的每个元素分别与
$path
进行比较。我不知道有哪一个操作符会像您在这里期望的那样进行惰性匹配

($badDir | ForEach-Object{$path -match [regex]::Escape($_)}) -contains $true
$badDir
元素包含regex元字符,因此我们需要对这些元字符进行转义以获得真正的匹配。然后,我们只需检查生成的布尔数组是否包含任何真元素。将其放入if块或管道中,您应该能够得到您想要的结果

根据您的实际实现,还有其他方法来处理此问题,但以上内容应该足够了

没有正则表达式 标题说没有正则表达式,所以让我们调整上面的内容,以删除该方法的这一部分。逻辑仍然是一样的

($badDir | ForEach-Object{$path.ToLower().IndexOf("$_".ToLower()) -ge 0}) -contains $true

检查一个字符串是否位于另一个字符串中。如果有,我们将作为布尔值进行计算,并像之前一样检查其中一个结果是否为真。

$badDir-Match$path.ToLower()
将“C:\Windows”与
$badDir
的每个元素进行比较。因为这些都不是匹配项,所以你会变得错误。由于模式字符串包含正则表达式,因此操作也很混乱。然而,无论如何,这不是你想要的

非常确定您需要将
$baddir
的每个元素分别与
$path
进行比较。我不知道有哪一个操作符会像您在这里期望的那样进行惰性匹配

($badDir | ForEach-Object{$path -match [regex]::Escape($_)}) -contains $true
$badDir
元素包含regex元字符,因此我们需要对这些元字符进行转义以获得真正的匹配。然后,我们只需检查生成的布尔数组是否包含任何真元素。将其放入if块或管道中,您应该能够得到您想要的结果

根据您的实际实现,还有其他方法来处理此问题,但以上内容应该足够了

没有正则表达式 标题说没有正则表达式,所以让我们调整上面的内容,以删除该方法的这一部分。逻辑仍然是一样的

($badDir | ForEach-Object{$path.ToLower().IndexOf("$_".ToLower()) -ge 0}) -contains $true
检查一个字符串是否位于另一个字符串中。如果有,我们将作为布尔值进行计算,就像之前一样,检查其中一个结果是否为真

我在这里做错了什么

你在测试错误的东西,测试错误的方向

由于$path值为“C:\Windows”,并且$badDir不包含“C:\Windows”,也不包含(包含“C:\Windows”的字符串),因此计算结果应返回false

如果不想使用正则表达式,则需要循环$badDir并测试每个项,然后查看结果:

$path = "C:\Windows"

$badDir = "windows",
    "i3\ic",
    "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
快,并且“第一个”截断将使其在匹配时立即停止,而不会测试所有其余元素

我在这里做错了什么

你在测试错误的东西,测试错误的方向

由于$path值为“C:\Windows”,并且$badDir不包含“C:\Windows”,也不包含(包含“C:\Windows”的字符串),因此计算结果应返回false

如果不想使用正则表达式,则需要循环$badDir并测试每个项,然后查看结果:

$path = "C:\Windows"

$badDir = "windows",
    "i3\ic",
    "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
快,并且“第一个”截断将使其在匹配时立即停止,而不会测试所有其他元素。

@Matt,这似乎不起作用。我想通过查找$path变量中的任意位置来匹配数组项。因此,如果我有
C:\Someotherdir\Windows\Hello
,它仍然会返回true。“不使用正则表达式”-我很好奇你为什么要这样写。我希望您能找到这样的解决方案:
$path-match($badDir-join'|')
或类似的?您要求避免使用正则表达式,然后在代码中使用
-match
,并且
-match
始终将右侧的内容视为正则表达式。@Matt,这似乎不起作用。我想通过查找$path变量中的任意位置来匹配数组项。因此,如果我有
C:\Someotherdir\Windows\Hello
,它仍然会返回true。“不使用正则表达式”-我很好奇你为什么要这样写。我希望您能找到这样的解决方案:
$path-match($badDir-join'|')
或类似的?您要求避免使用正则表达式,然后在代码中使用
-match
,并且
-match
始终将右侧的内容视为正则表达式。这非常优雅,效果完美。谢谢你,也谢谢@Matt解释我遗漏了什么。这非常优雅,效果完美。谢谢你,也谢谢@Matt解释了我遗漏了什么