具有特定文件扩展名的 Powershell 过滤器文件名
Powershell filter filenames with specific file extension
我正在开发一个 Powershell 脚本,该脚本将 return 基于过滤的一组名称和特定扩展名的文件列表,在本例中为 .pdf
扩展文件类型。我目前在 foreach
控制结构中设置了这个。
到目前为止我已经这样做了:
$MechDWGFilterList = @('*ifc*','*mech*', '*permit*', '*final*', '*CD*')
$MechDWGFile = @()
# $MechDWGFolder contains 1 or more filtered full path files
$MechDWGList = Get-ChildItem -Path $MechDWGFolder -Filter *.pdf -r | Sort-Object -Descending -Property LastWriteTime
$count = 0
foreach ($file in $MechDWGList)
{
# Where the file name contains one of these filters
foreach($filter in $MechDWGFilterList)
{
if($file.Name -like $filter)
{
$MechDWGFile += $file
$count += 1
}
}
}
但我想压缩如下所示的内容,这样我就可以避免从上面的代码中创建一个额外的对象 $MechDWGFile
。
$MechDWGFilterList = @('*ifc*','*mech*', '*permit*', '*final*', '*CD*')
$MechDWGFilterList2 = 'ifc|mech|permit|final|CD' #Tried this regex expression as well
$MechDWGList = Get-ChildItem -Path $MechDWGFolder -Filter ($MechDWGFilterList).pdf -r | Sort-Object -Descending -Property LastWriteTime
Write-Output $MechDWGList
我觉得我很接近,除非没有迭代控制循环这是完全不可能的。帮助理解这一挑战将不胜感激!
一些其他背景参考信息:PowerShell 5.1 正在用作管理员,Windows 10 OS
-Filter
仅支持 *
和 ?
通配符。在这种情况下,您可以将 Get-ChildItem
的结果通过管道传输到 Where-Object
以进行过滤:
$MechDWGList = Get-ChildItem -Path $MechDWGFolder -Filter *.pdf -r |
Where-Object { $_.Name -match 'ifc|mech|permit|final|CD' } |
Sort-Object -Descending -Property LastWriteTime
这基本上就像使用 foreach
循环和 if
条件一样:
$MechDWGList = & {
foreach($file in Get-ChildItem -Path $MechDWGFolder -Filter *.pdf -r) {
if($file.Name -match 'ifc|mech|permit|final|CD') { $file }
}
} | Sort-Object -Descending -Property LastWriteTime
我正在开发一个 Powershell 脚本,该脚本将 return 基于过滤的一组名称和特定扩展名的文件列表,在本例中为 .pdf
扩展文件类型。我目前在 foreach
控制结构中设置了这个。
到目前为止我已经这样做了:
$MechDWGFilterList = @('*ifc*','*mech*', '*permit*', '*final*', '*CD*')
$MechDWGFile = @()
# $MechDWGFolder contains 1 or more filtered full path files
$MechDWGList = Get-ChildItem -Path $MechDWGFolder -Filter *.pdf -r | Sort-Object -Descending -Property LastWriteTime
$count = 0
foreach ($file in $MechDWGList)
{
# Where the file name contains one of these filters
foreach($filter in $MechDWGFilterList)
{
if($file.Name -like $filter)
{
$MechDWGFile += $file
$count += 1
}
}
}
但我想压缩如下所示的内容,这样我就可以避免从上面的代码中创建一个额外的对象 $MechDWGFile
。
$MechDWGFilterList = @('*ifc*','*mech*', '*permit*', '*final*', '*CD*')
$MechDWGFilterList2 = 'ifc|mech|permit|final|CD' #Tried this regex expression as well
$MechDWGList = Get-ChildItem -Path $MechDWGFolder -Filter ($MechDWGFilterList).pdf -r | Sort-Object -Descending -Property LastWriteTime
Write-Output $MechDWGList
我觉得我很接近,除非没有迭代控制循环这是完全不可能的。帮助理解这一挑战将不胜感激!
一些其他背景参考信息:PowerShell 5.1 正在用作管理员,Windows 10 OS
-Filter
仅支持 *
和 ?
通配符。在这种情况下,您可以将 Get-ChildItem
的结果通过管道传输到 Where-Object
以进行过滤:
$MechDWGList = Get-ChildItem -Path $MechDWGFolder -Filter *.pdf -r |
Where-Object { $_.Name -match 'ifc|mech|permit|final|CD' } |
Sort-Object -Descending -Property LastWriteTime
这基本上就像使用 foreach
循环和 if
条件一样:
$MechDWGList = & {
foreach($file in Get-ChildItem -Path $MechDWGFolder -Filter *.pdf -r) {
if($file.Name -match 'ifc|mech|permit|final|CD') { $file }
}
} | Sort-Object -Descending -Property LastWriteTime