我有一个包含DNS .zone文件的文件夹。
我正在尝试返回IP地址类似于172.20.*
的所有文件和字符串。
我使用以下内容:
Get-ChildItem -Recurse -Path 'C:\Root' | Select-String -Pattern '*172.20.*' | group | select name
但这返回:
Select-String:字符串* 172.20。*不是有效的正则表达式:解析“ * 172.20。*”-量词{x,y}后不加任何内容。
我尝试在-SimpleMatch
中使用Select-String
案例,但没有成功。用双引号引起来的字符串也不起作用。
如果我使用实际文本作为样式,则它可以正常工作。
我的问题在哪里?
答案 0 :(得分:3)
就像错误消息一样:*172.20.*
不是有效的正则表达式。这是一个通配符模式,可以与-like
运算符一起使用,但不能与Select-String
一起使用。正则表达式中的*
是一个修饰符,不能独立存在,它需要适用于某些事物。与通配符*
(匹配零个或多个字符)的正则表达式等效为.*
。但是,由于默认情况下不固定正则表达式(与通配符模式不同),因此您无需在模式的开头和结尾添加它们即可使匹配生效。
将表达式更改为实际的正则表达式:
... | Select-String -Pattern '172\.20\.' | ...
或修改您的代码以使用通配符匹配而不是正则表达式匹配:
Get-ChildItem -Recurse -Path 'C:\Root' | Where-Object {
Get-Content $_.FullName | Where-Object { $_ -like '*172.20.*' }
} | Select-Object -Expand Name
使用-SimpleMatch
不适用于您的方法,因为-Pattern '*172.20.*' -SimpleMatch
会查找文字(子)字符串*172.20.*
(带有星号),该字符串可能不存在您的文件。如果您从模式中删除了通配符,那将是可行的:
... | Select-String -Pattern '172.20.' -SimpleMatch | ...