【问题标题】:Extract words from filename delineated by underscores and spaces in Powershell从Powershell中的下划线和空格划定的文件名中提取单词
【发布时间】:2021-07-27 15:23:00
【问题描述】:

我正在尝试从文件名中提取两个单词。名称的格式为:

__XXXXXXXX_XXX_XXXXXXX_XXXX_XXXXX_XXXX XXX_Aircraft 017_XXXXXXXX-XXXXXXX_XXXXXXX-XXXXXXX-XXXXXX-01Apr2021-XXXXX

X 被替换为不同的单词。我需要提取飞机编号和日期,以便仅使用该信息重命名文件。使用此站点的帮助,我尝试了以下方法来隔离飞机编号:

$names = gci -Path "H:\Path\to\Logs" *.log -Recurse | select @{n="Name"; e={if ($_.Name -match "Aircraft (\w+)") { 
  $matches[1] }}}

但是,它似乎没有给我我需要的匹配。但是,我在编程方面非常不熟练,可能会走错路。我希望用于隔离飞机编号的相同逻辑也适用于日期。

【问题讨论】:

  • 根据您的示例,您想提取 Aircraft 017 还是仅提取 01701Apr2021 对吗?
  • 飞机 017 比 017 更可取,但两者都可以。
  • 您正在测试整个.Name 是否与您的模式匹配。这将在找到匹配项时为您提供整个 .Name。如果您只想要项目的一部分,则需要将其拆分,然后抓取您想要的部分。
  • 我如何分割它并抓住那部分?我只有大约一个月的轻型 powershell 经验。
  • 您已经获取了一个感兴趣的部分,并通过$Matches[1] 访问它;您只需要扩展正则表达式以获取另一个,并通过$Matches[2] 访问它,如我的回答所示。

标签: powershell extract filenames


【解决方案1】:
# Create a sample file.
$file = New-Item '__XXXXXXXX_XXX_XXXXXXX_XXXX_XXXXX_XXXX XXX_Aircraft 017_XXXXXXXX-XXXXXXX_XXXXXXX-XXXXXXX-XXXXXX-01Apr2021-XXXXX'

# Substitute your `Get-ChildItem` command for $file
$file |
 Rename-Item -WhatIf -NewName {
   if ($_.Name -match '_(Aircraft \w+?)_.+(\d{2}[a-z]{3}\d{4})-') {
     # Synthesize the new file name from the extracted substrings.
     '{0} - {1}' -f $Matches[1], $Matches[2]
   } else {
     # Input file name didn't match, (effectively) do nothing.
     $_.Name
   }
 }

注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作会执行您想要的操作,请删除 -WhatIf

有关与上述-match 运算符一起使用的regex 的说明,请参阅this regex101.com page[1]

上面使用两个捕获组((...))来捕获感兴趣的子字符串,可以通过automatic $Matches variable的索引12访问。

-f,然后使用format operator 从捕获的子字符串中构建输出文件名。根据需要调整 LHS 格式字符串。

感谢-WhatIf,您将看到如下输出,这是删除-WhatIf 时会发生的情况的预览 - 请注意@987654342 中的新文件名@路径:

What if: Performing the operation "Rename File" on target 
"Item: /tmp/__XXXXXXXX_XXX_XXXXXXX_XXXX_XXXXX_XXXX XXX_Aircraft 017_XXXXXXXX-XXXXXXX_XXXXXXX-XXXXXXX-XXXXXX-01Apr2021-XXXXX
Destination: /tmp/Aircraft 017 - 01Apr2021".

注意脚本块 ({ ... }) 如何作为参数传递给Rename-Item-NewName 参数,然后通过自动automatic $_ variable 作用于每个输入文件和输出要用于手头输入对象的参数值。此类脚本块称为delay-bind script blocks


[1] 请注意,尽管 regex101.com,一个用于可视化、解释和试验正则表达式的网站,不支持 PowerShell 使用的 .NET 正则表达式引擎,但选择一个类似的引擎,例如 Java 的引擎,通常表现出相同的行为,至少从根本上是这样。

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 2014-11-27
    • 2018-01-28
    • 2013-05-24
    • 2018-11-25
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多