首页 > 解决方案 > PowerShell 连接 Get-ChildItem 的输出

问题描述

我有一个使用正则表达式搜索文件的工作脚本。该脚本为每个文件返回 2 行:父文件夹 naùe 和文件名(匹配正则表达式)。

Get-ChildItem -Path "D:\test\" -Recurse -File |
  Where-Object { $_.BaseName -match '^[0-9]+$' } |
    ForEach-Object { $_.FullName -Split '\',-3,'SimpleMatch' } | 
     select -last 2 | 
       Out-File "D:\wim.txt"

某个系统需要将输出放在一行上,并与例如 \ 或类似字符连接。请问我怎样才能做到这一点?

非常感谢 !

标签: powershellstring-formatting

解决方案


Get-ChildItem -Path D:\test -Recurse -File | 
  Where-Object { $_.BaseName -match '^[0-9]+$' } | 
    ForEach-Object { ($_.FullName -split '\\')[-2,-1] -join '\' } |                          #'
      Out-File D:\wim.txt
  • ($_.FullName -Split '\\')[-2,-1]从文件路径中提取最后 2 个组件
  • 并将-join '\'它们重新组合在一起。

请注意,除了行格式问题之外,您的原始命令无法按预期工作,因为| select -last 2它应用于整体输出,而不是每个匹配文件;因此,即使有多个匹配文件,您也只会获得最后一个匹配文件的父目录和文件名。

因此,上面的命令直接在操作结果上提取\最后 2 个分隔的路径组件,以便每个文件返回 2 个(连接的)组件。ForEach-Object-split

顺便说一句,-3in$_.FullName -split '\', -3, 'SimpleMatch'不会提取最后 3 个标记;它目前被有效地视为与 相同,这意味着返回所有结果标记;鉴于默认使用正则表达式,并且表示文字需要转义为,与 相同,这就是上述解决方案所使用的。0-split\\\$_.FullName -split '\', -3, 'SimpleMatch'$_.FullName -split '\\'

请注意,有一个绿灯-split增强功能将在未来赋予负值<Max-substrings>的含义,将当前的正数逻辑类似地应用于输入字符串的末尾;例如,-3将意味着:返回最后 2 个组件加上它们之前输入字符串的左侧(结果标记仍然从左到右报告)。


推荐阅读