这个脚本几乎就是我所需要的:
$input_path = 'C:\Common'
$output_file = 'C:\Common\extracted.txt'
$regex = 'assets'
Get-ChildItem -Path $input_path -Filter *.txt
| Select-String -Pattern $regex -AllMatches
| Out-File $output_file -Force
我遇到的问题是,当我将 $inputpath 更改为“C:\Common\Data”时,输出文件会在行首添加 Data\。有人能告诉我如何在输出中不显示最后一个文件夹名称吗?
答案1
ls -Fo $input_path -Fi *.txt|Select-String -Patt $regex -All|%{$f=$_.path -split '\\';$f[-2]+'\;'+$_.filename+';'+$_.linenumber+';'+$_.line}|Out-File $output_file -Fo -width 400 -OutB 0x7FFFFFFF -EA 0
-OutB 0x7FFFFFFF
- 文件分配缓冲区大小 - 加速创建和填充文件-width 400
- 文件中的线宽,默认大小为 80-EA 0
= ErrorAction - 跳过所有错误$f=$_.path -split '\\'
- 拆分完整文件路径、分隔符\
并将各部分保存到数组$f
$f[-2]
- 返回末尾数组 $f 处的第二个元素(文件目录;在此示例中为 -Data
目录)$_.filename
- 文件名$_.linenumber
- 行号,搜索模式($regex 变量)$_.line
- 行号处的文本ls -Fo $input_path -Fi *.txt
<=>Get-ChildItem -Path $input_path -Filter *.txt
Select-String -Patt $regex -All
<=>Select-String -Pattern $regex -AllMatches