Powershell - 从列表中搜索文件 - 仅显示匹配项时出现问题
Powershell - Search for files from list - Trouble displaying just the match
我有一个脚本,用于从列表中跨多个驱动器搜索数百个文件。它工作正常,因为它捕获了所有匹配项。唯一的问题是我需要查看它与扩展名匹配的文件。
有点背景故事...
我们有与 Copybook 同名的程序。在大型机世界中并不少见。搜索文件时,我必须对搜索使用通配符才能捕获所有同名文件(减去扩展名)。然后我必须手动搜索命中以确定它们是字帖还是程序。
当我尝试向下面的脚本添加任何逻辑时,它会显示整个文件名数组,而不仅仅是实际匹配项。
任何人都可以协助捕获和显示匹配的文件及其扩展名吗?也许它也是位置?
此致,
-罗恩
#List containing file names must be wilcarded FILE.*
#Parent folder (Where to begin search)
$folder = 'C:\Workspace\src'
#Missing Artifacts Folder (Where Text file resides)
$Dir2 = 'C:\Workspace\Temp'
#Text File Name
$files=Get-Content $Dir2\FilesToSearchFor.txt
cd \
cd $folder
Write-Host "Folder: $folder"
# Get only files and only their names
$folderFiles = (Get-ChildItem -Recurse $folder -File).Name
foreach ($f in $files) {
#if ($folderFiles -contains $f) {
if ($folderFiles -like $f) {
Write-Host "File $f was found." -foregroundcolor green
} else {
Write-Host "File $f was not found!" -foregroundcolor red
}
}
不是测试整个文件名列表是否包含目标文件名 ($folderFiles -like $f
),而是将所有文件加载到哈希表中,然后使用 [=12] 测试目标文件名是否作为键存在=]:
$fileTable = @{}
Get-ChildItem -Recurse $folder -File |ForEach-Object {
# Create a new key-value entry for the given file name (minus the extension) if it doesn't already exist
if(-not $fileTable.ContainsKey($_.BaseName)){
$fileTable[$_.BaseName] = @()
}
# Add file info object to the hashtable entry
$fileTable[$_.BaseName] += $_
}
foreach($f in $files){
if($fileTable.ContainsKey($f)){
Write-Host "$($fileTable[$f].Count) file(s) matching '$f' were found." -ForegroundColor Green
foreach($file in $fileTable[$f]){
Write-Host "File with extension '$($file.Extension)' found at: '$($file.FullName)'"
}
}
else {
Write-Host "No files found matching '$f'"
}
}
由于 $fileTable
不仅包含名称,还包含对具有由 Get-ChildItem
返回的名称的原始文件信息对象的引用,您可以轻松访问相关元数据(如 Extension
属性) 现在
我有一个脚本,用于从列表中跨多个驱动器搜索数百个文件。它工作正常,因为它捕获了所有匹配项。唯一的问题是我需要查看它与扩展名匹配的文件。 有点背景故事... 我们有与 Copybook 同名的程序。在大型机世界中并不少见。搜索文件时,我必须对搜索使用通配符才能捕获所有同名文件(减去扩展名)。然后我必须手动搜索命中以确定它们是字帖还是程序。 当我尝试向下面的脚本添加任何逻辑时,它会显示整个文件名数组,而不仅仅是实际匹配项。 任何人都可以协助捕获和显示匹配的文件及其扩展名吗?也许它也是位置?
此致, -罗恩
#List containing file names must be wilcarded FILE.*
#Parent folder (Where to begin search)
$folder = 'C:\Workspace\src'
#Missing Artifacts Folder (Where Text file resides)
$Dir2 = 'C:\Workspace\Temp'
#Text File Name
$files=Get-Content $Dir2\FilesToSearchFor.txt
cd \
cd $folder
Write-Host "Folder: $folder"
# Get only files and only their names
$folderFiles = (Get-ChildItem -Recurse $folder -File).Name
foreach ($f in $files) {
#if ($folderFiles -contains $f) {
if ($folderFiles -like $f) {
Write-Host "File $f was found." -foregroundcolor green
} else {
Write-Host "File $f was not found!" -foregroundcolor red
}
}
不是测试整个文件名列表是否包含目标文件名 ($folderFiles -like $f
),而是将所有文件加载到哈希表中,然后使用 [=12] 测试目标文件名是否作为键存在=]:
$fileTable = @{}
Get-ChildItem -Recurse $folder -File |ForEach-Object {
# Create a new key-value entry for the given file name (minus the extension) if it doesn't already exist
if(-not $fileTable.ContainsKey($_.BaseName)){
$fileTable[$_.BaseName] = @()
}
# Add file info object to the hashtable entry
$fileTable[$_.BaseName] += $_
}
foreach($f in $files){
if($fileTable.ContainsKey($f)){
Write-Host "$($fileTable[$f].Count) file(s) matching '$f' were found." -ForegroundColor Green
foreach($file in $fileTable[$f]){
Write-Host "File with extension '$($file.Extension)' found at: '$($file.FullName)'"
}
}
else {
Write-Host "No files found matching '$f'"
}
}
由于 $fileTable
不仅包含名称,还包含对具有由 Get-ChildItem
返回的名称的原始文件信息对象的引用,您可以轻松访问相关元数据(如 Extension
属性) 现在