Arrays 如何从powershell中的扩展名类型数组中提取/匹配文件类型扩展名

Arrays 如何从powershell中的扩展名类型数组中提取/匹配文件类型扩展名,arrays,powershell,Arrays,Powershell,我只想使用Powershell从Sharepoint库中提取所需的文件类型 我使用下面的逻辑,但它不是100%正确工作。它仍然与文件名包含的扩展名类型匹配,但扩展名类型不好 请帮我更正脚本 $libfiles = ".pptx",".xlsx",".xls",".docx",".doc",".pdf",".jpeg",".jpg",&qu

我只想使用Powershell从Sharepoint库中提取所需的文件类型

我使用下面的逻辑,但它不是100%正确工作。它仍然与文件名包含的扩展名类型匹配,但扩展名类型不好

请帮我更正脚本

$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()
  • 如果您正在匹配文件扩展名,并且默认情况下,
    -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)$