PowerShell连接Get-ChildItem的输出

时间:2018-11-26 00:34:00

标签: powershell string-formatting

我有一个工作脚本,该脚本搜索带有正则表达式的文件。该脚本每个文件返回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"

某个系统需要将输出与(例如)\或类似字符连接在一起。请问我该如何实现?

非常感谢!

1 个答案:

答案 0 :(得分:1)

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已应用于整体输出,而不是每个匹配文件;因此,即使存在多个匹配文件,您也只会获得 last 匹配文件的父目录和文件名。

因此,上面的命令直接根据\操作的结果提取ForEach-Object块内的最后两个-split分隔的路径分量 每个文件都返回2个(连接的)组件

顺便说一句,-3中的$_.FullName -split '\', -3, 'SimpleMatch'不会提取最后三个令牌;当前有效地将其与0相同,这意味着将返回 all 个结果令牌;假设-split默认使用 regexes ,并且表示文字\需要转义为\\,则$_.FullName -split '\', -3, 'SimpleMatch'与{{1}相同},这就是上面的解决方案所使用的。

请注意,将来会有green-lit -split enhancement赋予负<Max-substrings> values新的含义,类似于将当前的正数逻辑应用于输入字符串的 end ;例如,$_.FullName -split '\\'的意思是:返回最后2个组成部分以及输入字符串之前剩余的所有内容(结果标记仍然从左到右报告)。

相关问题