我有一个工作脚本,该脚本搜索带有正则表达式的文件。该脚本每个文件返回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"
某个系统需要将输出与(例如)\或类似字符连接在一起。请问我该如何实现?
非常感谢!
答案 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个组成部分以及输入字符串之前剩余的所有内容(结果标记仍然从左到右报告)。