PowerShell - 无法通过子目录递归搜索 [LIKE] 文件名
PowerShell - Unable to Search for [LIKE] File Names recursively through sub-directories
我有一个需要搜索的数百个文件的列表。大多数没有文件扩展名,有些有。如果必须的话,我可以将这些和 运行 作业分开多次。
我有一个脚本,我一直在努力使它正确,但它似乎不起作用。
我只需要匹配文件名而不是扩展名。
我正在使用“-Like”选项,但这并没有得到我需要的结果。如果我包含一个文件扩展名,那么它就可以工作。不幸的是,我有许多扩展名未知的文件名,我只需要匹配名称即可。
此外,该脚本似乎没有扫描子目录以查找匹配项。 -Recurse 在我的示例中不起作用吗?
最后,在测试和我强制匹配时,它不显示找到匹配项的子目录。
非常欢迎任何帮助。
问候,
-罗恩
#Start in this DIR
$folder = 'C:\Workspace\'
#Get the file list here
$Dir2 = 'C:\Workspace\'
$files=Get-Content $Dir2\MISSING_BMS.txt
Write-Host "Starting Folder: $folder"
# Get only files and only their names
$folderFiles = Get-ChildItem -Recurse $folder -File -Name
#Read through Directory and sub-directories
foreach ($f in $files) {
if ($folderFiles -contains $f) {
Write-Host "File $f was found." -foregroundcolor green
} else {
Write-Host "File $f was not found!" -foregroundcolor red
}
}
Get-ChildItem
的 -Name
开关在与 -Recurse
组合时不只是输出 names,它输出子目录内项目的相对路径。
因此,最好不要使用此开关,并与 [System.IO.FileInfo]
个实例的 .Name
属性 进行比较 Get-ChildItem
默认发出。
# Get only files and only their names - note the use of (...).Name
$folderFiles = (Get-ChildItem -Recurse $folder -File).Name
请注意,如果您的 $Dir2\MISSING_BMS.txt
文件包含 逐字 文件名而不是 通配符模式 ,您应该使用 -contains
operator rather than -like
, the wildcard matching operator.
此外,如果您以后需要访问完整路径:
# Get the files as [System.IO.FileInfo] instances
$folderFileInfos = Get-ChildItem -Recurse $folder -File
# ...
# Access the .Name property now, using member enumeration, and see
# if the array of names contains $f
if ($folderFileInfos.Name -contains $f) { ...
我有一个需要搜索的数百个文件的列表。大多数没有文件扩展名,有些有。如果必须的话,我可以将这些和 运行 作业分开多次。
我有一个脚本,我一直在努力使它正确,但它似乎不起作用。
我只需要匹配文件名而不是扩展名。
我正在使用“-Like”选项,但这并没有得到我需要的结果。如果我包含一个文件扩展名,那么它就可以工作。不幸的是,我有许多扩展名未知的文件名,我只需要匹配名称即可。
此外,该脚本似乎没有扫描子目录以查找匹配项。 -Recurse 在我的示例中不起作用吗?
最后,在测试和我强制匹配时,它不显示找到匹配项的子目录。
非常欢迎任何帮助。 问候, -罗恩
#Start in this DIR
$folder = 'C:\Workspace\'
#Get the file list here
$Dir2 = 'C:\Workspace\'
$files=Get-Content $Dir2\MISSING_BMS.txt
Write-Host "Starting Folder: $folder"
# Get only files and only their names
$folderFiles = Get-ChildItem -Recurse $folder -File -Name
#Read through Directory and sub-directories
foreach ($f in $files) {
if ($folderFiles -contains $f) {
Write-Host "File $f was found." -foregroundcolor green
} else {
Write-Host "File $f was not found!" -foregroundcolor red
}
}
Get-ChildItem
的 -Name
开关在与 -Recurse
组合时不只是输出 names,它输出子目录内项目的相对路径。
因此,最好不要使用此开关,并与 [System.IO.FileInfo]
个实例的 .Name
属性 进行比较 Get-ChildItem
默认发出。
# Get only files and only their names - note the use of (...).Name
$folderFiles = (Get-ChildItem -Recurse $folder -File).Name
请注意,如果您的 $Dir2\MISSING_BMS.txt
文件包含 逐字 文件名而不是 通配符模式 ,您应该使用 -contains
operator rather than -like
, the wildcard matching operator.
此外,如果您以后需要访问完整路径:
# Get the files as [System.IO.FileInfo] instances
$folderFileInfos = Get-ChildItem -Recurse $folder -File
# ...
# Access the .Name property now, using member enumeration, and see
# if the array of names contains $f
if ($folderFileInfos.Name -contains $f) { ...