我有一堆使用此命令在powershell中生成的文档列表:
Get-ChildItem -Recurse |
Select-String -Pattern "acrn164524" |
group Path |
select Name > test.txt
在这个例子中,它生成一个包含字符串acrn164524的文件列表,输出如下所示:
Name
----
C:\data\logo.eps
C:\data\invoice.docx
C:\data\special.docx
InputStream
C:\datanew\special.docx
我一直在使用
Get-Content "test.txt" | ForEach-Object {
Copy-Item -Path $_ -Destination "c:\destination\" -Recurse -Container -Force
}
但是,如果两个或多个文件具有相同的名称,则会出现问题,并且还会为文件中不是路径的任何行引发一堆错误。
抱歉,如果我不够清楚,我想通过在文件名的末尾添加一些内容来保留具有相同名称的文件。
答案 0 :(得分:1)
您似乎想要文件,而不是Get-ChildItem -Recurse -File | Where-Object {
$_ | Select-String acrn164524 -Quiet
} | Select-Object -ExpandProperty FullName | Out-File test.txt
的输出。所以我们保留文件。
-File
下面
Get-ChildItem
会使*.txt
仅返回实际文件。认为
关于使用像-Quiet
这样的过滤器来减少工作量。Select-String
会$true
返回$false
或Where-Object
非常适合Select-Object -ExpandProperty X
。而不是Select-Object
来检索原始属性值数组(而不是PSObjects数组,这是ForEach-Object X
通常会做的事情),使用{{1}更简单而不是。
Get-ChildItem -Recurse -File | Where-Object {
$_ | Select-String acrn164524 -Quiet
} | ForEach-Object FullName | Out-File test.txt