检查数组项是否包含在字符串中,而不在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解释了我遗漏了什么