如何使用Get-Childitem搜索具有不同名称的多个文件?

How to search for multiple files with different names using Get-Childitem?

提问人:Nathan 提问时间:10/13/2023 更新时间:10/13/2023 访问量:58

问:

我正在尝试查找许多不同的文件,这些文件存储在具有随机生成名称的多个驱动器上,它们都具有相同的文件扩展名。我可以从创建它们的程序中获取名称,但我想自动执行搜索和复制功能以将它们移动到单独的文件夹,这是我到目前为止所拥有的,但它无法编译:

$paths="C:\","D:\","E:\","F:\"
$files="FileA", “FileB”,”FileC”

for ($i=0; $i -lt $files.Length; $i++) {
$file="*" + $files[i] + "*.txt"
Get-ChildItem -Path $paths -recurse -Filter $file | Out-File C:\report.txt
} 

Write-Host "Press any key to continue..."
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

如果我想手动运行命令,那么它会将文件路径输出到报告 .txt 文件,很好:

Get-ChildItem -Path $paths -recurse -Filter *FileA*.icl | Out-File C:\report.txt

此外,我如何获取生成的列表并将其全部复制到单独的文件夹中?

Windows PowerShell 文件

评论

3赞 Olaf 10/13/2023
这是非常低效的。通过这样的循环,您将多次搜索所有驱动器。而不是你可以使用,因为你可以提供一个名称数组。-Filter-Include
3赞 Santiago Squarzon 10/13/2023
补充奥拉夫的评论,通过“编译失败”,我假设你的意思是有一个错误,如果是这样,应该是$files[i]$files[$i]
0赞 Nathan 10/13/2023
@SantiagoSquarzon将 $files[i] 更正为 $files[$i] 确实清除了我收到的错误 谢谢先生,感谢您的输入!
0赞 Nathan 10/13/2023
@Olaf 您介意扩展 -Include 的使用吗?我应该删除双 * 并只搜索数组吗?
0赞 Nathan 10/13/2023
更正错误后的新问题 for 循环每次都会覆盖报告 .txt 文件。有没有更好的方法来保存输出?

答:

2赞 Santiago Squarzon 10/13/2023 #1

Olaf 在他有用的评论中指出的是,您可以利用该参数,该参数可以采用通配符模式数组,而采用单个字符串。这将改进您的代码,因为对 Get-ChildItem -Recurse 的调用将只有一个,而不是$files中每个项的一个调用。-Include-Filter

关于“编译失败”,这大概是语法错误,什么时候应该是.$files[i]$files[$i]

关于将找到的文件复制到目标文件夹,请参阅添加的行,获取找到的文件,将它们复制到目标文件夹(将路径更改为现有文件夹),然后这些复制文件的详细信息存储在文件中,请注意使用 而不是 ,您在这里处理的是对象而不是纯文本,因此您希望使用旨在将对象转换为结构化数据的 cmdletCopy-Itemreport.csvExport-CsvOut-File

$paths = 'C:\', 'D:\', 'E:\', 'F:\'
$files = 'FileA', 'FileB', 'FileC'

$patterns = $files.ForEach({ [WildcardPattern]::Escape($_) + '*.txt' })
Get-ChildItem -Path $paths -Recurse -Include $patterns |
    Copy-Item -Destination path\to\theDestinationFolder -PassThru |
    Export-Csv C:\report.csv -NoTypeInformation

Write-Host 'Press any key to continue...'
$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')