PowerShell 连接 Get-ChildItem 的输出

PowerShell concatenate output of Get-ChildItem

我有一个可以使用正则表达式搜索文件的工作脚本。脚本 returns 每个文件 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"

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

非常感谢!

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应用于总体输出,而不是每个匹配文件;因此,即使有多个个匹配文件,你也只会得到最后一个个匹配文件的父目录和文件名。

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

顺便说一句,$_.FullName -split '\', -3, 'SimpleMatch' 中的 -3 而不是 提取最后 3 个标记;它目前被有效地视为与 0 相同,这意味着 所有 生成的标记都是 returned;鉴于 -split 默认使用 regexes,并且表示文字 \ 需要转义为 \$_.FullName -split '\', -3, 'SimpleMatch'$_.FullName -split '\',这就是上面的解决方案所使用的。

注意后面有一个green-lit -split enhancement that will give negative <Max-substrings> values新的含义,将当前的正数逻辑类比于输入字符串的end;例如,-3 表示:return 最后 2 个组件加上它们之前输入字符串的剩余部分(生成的标记仍然从左到右报告)。