如何使用 Powershell 中的文件命名约定获取文件

How to fetch the file with the file naming convention in Powershell

我想使用 powershell 脚本从目录中的其他文件列表中获取具有以下文件命名约定的今天的文件。需要匹配今天的日期和文件名。

TransferAA_MGH_20211206070920_xlsx.XLSX
TransferBB_MGH_20211206071130_xlsx.XLSX

我在下面尝试过,但它不起作用。 Get-ChildItem -Path Testfolder\*.XLSX | Where-Object {$_.Name -match '(?:^|.*\D)(\d{8})(?:\D.*|$)' -and $Matches[1] -eq ((Get-Date).Date) 感谢您的帮助。

这应该适合你:

Get-ChildItem -Path Testfolder\*.XLSX | 
  Where-Object {$_.Name -cmatch 'Transfer[A-Z]{2}_MGH_[0-9]{14}_xlsx.XLSX' -and $Matches[1] -like (Get-Date -Format "yyyyMMdd").Date}

打破 regex 模式:

  • Transfer - 文字字符串
  • [A-Z]{2} - 两个大写字母
  • _MHM_ - 文字字符串
  • [0-9]{14} - 14 位数字
  • _xlsx.XLSX - 文字字符串

(Get-Date -Format "yyyyMMdd").Date 语法用于获取正确格式化今天的日期以进行比较。

这对我有用,你可以试一试。例如:

$today = [datetime]::Today

@'
TransferAA_MGH_20211206070920_xlsx.XLSX
TransferBB_MGH_20211206071130_xlsx.XLSX
TransferAA_MGH_20211205070920_xlsx.XLSX
TransferBB_MGH_20211205071130_xlsx.XLSX
TransferAA_MGH_20211204070920_xlsx.XLSX
TransferBB_MGH_20211204071130_xlsx.XLSX
'@ -split '\r?\n' | Where-Object {
    [datetime]::ParseExact(
        [regex]::Match($_, '\d{14}').Value,
        'yyyyMMddHHmmss',
        [cultureinfo]::InvariantCulture
    ).Date -eq $today
}

# Results:
TransferAA_MGH_20211206070920_xlsx.XLSX
TransferBB_MGH_20211206071130_xlsx.XLSX

因此,您的搜索将如下所示:

# This filter seem to work OK while testing
Get-ChildItem -Path . -Filter '*_*_??????????????_????.xlsx'

# So:
$today = [datetime]::Today

Get-ChildItem -Path 'path/to/TestFolder' -Filter '*_*_??????????????_????.xlsx' |
Where-Object {
    [datetime]::ParseExact(
        [regex]::Match($_.BaseName, '\d{14}').Value,
        'yyyyMMddHHmmss',
        [cultureinfo]::InvariantCulture
    ).Date -eq $today
}

如果您希望过滤器更加严格,您可以使用:

-Filter 'Transfer??_MGH_??????????????_xlsx.xlsx'