PowerShell - 将目录中的文件夹名称与文件名称进行比较

问题描述

我正在寻找一种方法将目录中的所有文件夹与目录中的所有文件进行比较并报告匹配列表(文件的扩展名无关紧要) .

我有

Get-ChildItem $Path -Directory | ForEach-Object {}

-或-

(Get-ChildItem $Path -File).BaseName | ForEach-Object {}

我找不到一种简单的方法,我觉得我缺少只获取不包含路径的文件夹/目录名称。我认为可能有这样的事情之一:

$file.BaseName $file.FullName -leaf

即使这样,我也很困惑如何检查名称是否匹配?

另外,我把星号放在所有周围,因为我认为有人可能知道一种更有效的方法,比如如果文件名称的第一个字母与文件名的第一个字母不匹配,则不需要比较它们进一步。

任何帮助将不胜感激!


使用下面的答案,我觉得这更接近我想要的,但它似乎仍然不起作用。

$path1 = "C:\Users"
$Folders = Get-ChildItem -path $path1 -Directory
$Files = (Join-Path (Get-ChildItem -path $path1 -File).DirectoryName (Get-ChildItem -path $path1 -File).BaseName)

Compare-Object $Folders $Files -Property Name -ExcludeDifferent

解决方法

如果您想要的只是一个 BaseName 等于源目录中文件夹名之一的文件名列表,为什么不简单地这样做:

$sourceDirectory = 'C:\Users'
# get an array of foldernames
$folderNames = (Get-ChildItem -Path $sourceDirectory -Directory).Name
# output a list of filenames with matching BaseNames
(Get-ChildItem -Path $sourceDirectory -File | Where-Object {$folderNames -contains $_.BaseName}).FullName
,

正如奥拉夫所建议的:

$path1 = "C:\Test\powershell\folder1"
$path2 = "C:\Test\powershell\folder2"
$Folder1 = Get-ChildItem -Recurse -path $path1
$Folder2 = Get-ChildItem -Recurse -path $path2

Compare-Object $Folder1 $Folder2 -Property Name,Length | Where-Object {$_.sideIndicator -eq '=>'}