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

PowerShell - Compare Folder Names in Directory to File Names

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

我有:

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

-或-

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

我找不到一种简单的方法,我觉得我缺少只获取不包含路径的 folder/directory 名称的方法。我想可能有这样的东西之一:

$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

正如 Olaf 所建议的那样:

$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 '=>'}

如果您只需要一个文件名列表,其 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