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

时间:2016-10-25 14:37:55

标签: arrays powershell

我想使用Powershell

从Sharepoint库中仅提取所需的文件类型

我正在使用以下逻辑,但它无法正常工作。它仍然匹配文件名包含扩展类型,这是不好的。

请帮我纠正脚本。

$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出乎意料的是。

由于 Vishwa

3 个答案:

答案 0 :(得分:6)

我相信这就是你要找的东西。我明确地从文件数组中提取文件扩展名,并在扩展名存在时打印。

$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 "
    }
}

答案 1 :(得分:2)

$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 "
    }
}

请注意,我只是逃脱了#39;列出的所有扩展程序前面的句点(.)。这绝不是最有效的方法,但有助于简单地向您展示.如何表示"任何事情"在RegEx术语中,而不是实际代表期间本身。如果要定义显式句点,可以使用反斜杠\来转义正常表示。

这会给你:

  

xlsfile.avi文件类型不存在
  asxlsxfile.mdf文件类型不存在
  navigation.css文件类型不存在

测试正面结果,验证和更改$arr

$arr = @("xlsfile.pptx","pptxlsmgif.mdf","navigation.doc")

收率:

  

xlsfile.pptx文件类型存在
  asxlsxfile.mdf文件类型不存在
  navigation.doc文件类型存在

编辑:感谢下面的(更好,更有效)答案,我已更新$libfiles以显示边缘案例问题,其中docx.xls.ddf等文件名也会 错误地在不应该的时候报告正确。所以,我已经停留在" end"文件名,使用$到每个扩展名的末尾,并封装在括号中。

答案 2 :(得分:1)

要使正则表达式(正则表达式)按预期工作,需要做两件事:

  • 您必须 转义正则表达式元字符(具有特殊含义的字符,例如.)才能查找字符串; \用于转义,因此文字 .必须表示为\.

    • 虽然您可以将转义硬编码到正则表达式的组件中,但这很麻烦,并不总是一种选择。幸运的是,.NET框架为任意字符串的泛型转义提供了[regex]::Escape()
  • 您必须 将正则表达式锚定输入字符串的 end $,因为您'匹配文件扩展名, -match运算符默认执行子串匹配

误报的原因是缺少这两个方面,导致输入文件名sxlsx的子串asxlsxfile.mdf与子表达式.xlsx匹配

以下命令就是这样:

$libfilesregex = '(' + (($libfiles | % { [regex]::Escape($_) }) -join '|') + ')$'

$libfilesregex现在包含:

(\.pptx|\.xlsx|\.xls|\.docx|\.doc|\.pdf|\.jpeg|\.jpg|\.ppt|\.xlsm|\.gif|\.png)$

产生所需的结果。