我想使用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
答案 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)
要使正则表达式(正则表达式)按预期工作,需要做两件事:
您必须 转义正则表达式元字符(具有特殊含义的字符,例如.
)才能查找字符串; \
用于转义,因此文字 .
必须表示为\.
[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)$
产生所需的结果。