Arrays 如何从powershell中的扩展名类型数组中提取/匹配文件类型扩展名
我只想使用Powershell从Sharepoint库中提取所需的文件类型 我使用下面的逻辑,但它不是100%正确工作。它仍然与文件名包含的扩展名类型匹配,但扩展名类型不好 请帮我更正脚本Arrays 如何从powershell中的扩展名类型数组中提取/匹配文件类型扩展名,arrays,powershell,Arrays,Powershell,我只想使用Powershell从Sharepoint库中提取所需的文件类型 我使用下面的逻辑,但它不是100%正确工作。它仍然与文件名包含的扩展名类型匹配,但扩展名类型不好 请帮我更正脚本 $libfiles = ".pptx",".xlsx",".xls",".docx",".doc",".pdf",".jpeg",".jpg",&qu
$libfiles = ".pptx",".xlsx",".xls",".docx",".doc",".pdf",".jpeg",".jpg",".ppt",".xlsm",".gif",".png"
$libfilesregex = [string]::Join('|', $libfiles)
$arr = @("xlsfile.avi","asxlsxfile.mdf","navigation.css")
foreach($i in $arr)
{
if($i -match $libfilesregex)
{
Write-Host " $($i) File type exists "
}
else
{
Write-Host " $($i) File type does not exist "
}
}
它正在输出:
xlsfile.avi文件类型不存在
asxlsxfile.mdf文件类型存在
navigation.css文件类型不存在
请注意,这些文件都不应报告为已存在,但却意外报告为asxlsxfile.mdf
谢谢
维什瓦
请注意,我只是“转义”了列出的所有扩展前面的句点(
)。这绝不是最有效的方法,但有助于简单地向您展示
如何用正则表达式表示“任何东西”,而不是实际表示周期本身。如果要定义显式句点,可以使用反斜杠\
来转义正常表示
这将为您提供:
xlsfile.avi文件类型不存在asxlsxfile.mdf文件类型不存在
navigation.css文件类型不存在 以及测试阳性结果、验证和更改
$arr
:
$arr=@(“xlsfile.pptx”、“pptxlsmgif.mdf”、“navigation.doc”)
收益率:
xlsfile.pptx文件类型存在asxlsxfile.mdf文件类型不存在
navigation.doc文件类型已存在
编辑:由于下面的答案(更好、更有效),我更新了
$libfiles
,以显示一个边缘案例问题,其中文件名(如docx.xls.ddf
)也将错误地报告为正确,而不应该报告。因此,我锚定到文件名的“末尾”,在每个扩展名的末尾使用$
,并封装在括号中。我相信这就是您要查找的内容。我从文件数组中显式提取文件扩展名,如果扩展名存在,则打印
$libfiles = ".pptx",".xlsx",".xls",".docx",".doc",".pdf",".jpeg",".jpg",".ppt",".xlsm",".gif",".png"
$arr = @("xlsfile.avi","asxlsxfile.mdf","navigation.css", "lib.pptx")
foreach($i in $arr)
{
if($libfiles -contains [io.path]::GetExtension($i))
{
Write-Host "$([io.path]::GetExtension($i)) File type exists "
}
else
{
Write-Host "$([io.path]::GetExtension($i)) File type does not exist "
}
}
要使regex(正则表达式)按预期工作,需要两件事:
- 您必须在要查找的字符串中转义正则表达式元字符(具有特殊含义的字符,例如
)<代码>\用于转义,因此文本
必须表示为\.
- 虽然可以将转义硬编码到正则表达式的组件中,但这很麻烦,而且并不总是一个选项。幸运的是.NET framework为任意字符串的一般转义提供了
[regex]::Escape()
- 虽然可以将转义硬编码到正则表达式的组件中,但这很麻烦,而且并不总是一个选项。幸运的是.NET framework为任意字符串的一般转义提供了
- 如果您正在匹配文件扩展名,并且默认情况下,
操作符执行子字符串匹配,则必须使用-match
将正则表达式锚定到输入字符串的末尾$
asxlsxfile.mdf
的子字符串sxlsx
匹配子表达式.xlsx
以下命令仅用于此目的:
$libfilesregex = '(' + (($libfiles | % { [regex]::Escape($_) }) -join '|') + ')$'
$libfilesregex
现在包含以下内容:
(\.pptx|\.xlsx|\.xls|\.docx|\.doc|\.pdf|\.jpeg|\.jpg|\.ppt|\.xlsm|\.gif|\.png)$
这会产生想要的结果。我喜欢这个。连接以及正则表达式集成。非常好。++用于绕过正则表达式问题的实用方法。我建议您在两个方面使代码更像PowerShell:使用
-contains
操作符而不是.contains()
方法,并删除$(…)
围绕[io.path]::GetExtension()
调用:if($libfiles-contains[io.path]::GetExtension($I))的不必要的$(){…
感谢您对我的帖子提出的建设性反馈。今后我一定会相应地调整我的代码。
(\.pptx|\.xlsx|\.xls|\.docx|\.doc|\.pdf|\.jpeg|\.jpg|\.ppt|\.xlsm|\.gif|\.png)$