Скрипт Powershell для сравнения структуры папок
Я пытаюсь написать сценарий powershell, который будет проверять структуру папок для каталога на соответствие макету структуры папок шаблона и сообщать, будут ли разные, т.е. отсутствующие папки или добавленные разные папки.
Folder Template Structure
Folder A
Folder B
Directory 1 to check
Folder A
Folder B
Folder C
Directory 2 to check
Folder A
Таким образом, для Справочника 1 он сообщит, что Папка C является дополнительной, а для Справочника 2 - что Папка B отсутствует
Любая помощь будет принята с благодарностью
2 ответа
# Get the directories inside the template dir. as relative paths
$templateDirs = Get-ChildItem -Directory -Recurse -Name $templatePath
# Ditto for directory 1 and directory 2
$dir1Dirs = Get-ChildItem -Directory -Recurse -Name $dir1Path
$dir2Dirs = Get-ChildItem -Directory -Recurse -Name $dir2Path
# Compare to the template dirs.
Compare-Object $templateDirs $dir1Dirs
'---' # Output separator string just to show distinct outputs.
Compare-Object $templateDirs $dir2Dirs
Обратите внимание на использование -Name
с Get-ChildItem
, который вызывает все подкаталоги (-Directory
, -Recurse
сообщаться как пути относительно входного каталога, что позволяет удобно сравнивать между деревьями каталогов.
Также обратите внимание, что Compare-Object
командлет по умолчанию выводит [pscustomobject]
экземпляры с двумя свойствами и только для различий между входными наборами:
.InputObject
, в вашем случае относительный путь к каталогу, который уникален для одного входного набора..SideIndicator
, которая является строкой, указывающей, был ли входной объект уникальным для левой стороны (первый входной набор, неявно связанный с параметром-ReferenceObject
) -'<='
- или справа (второй входной набор, неявно связанный с параметром-DifferenceObject
) -'=>'
Выше приведено что-то вроде:
InputObject SideIndicator
----------- -------------
C => # folder C only in dir. 1, not in template dir.
---
B <= # folder B only in template dir., not in dir. 2
Чтобы сравнить две папки, выполните следующие действия (из: https://blogs.technet.microsoft.com/heyscriptingguy/2011/10/08/easily-compare-two-folders-by-using-powershell/):
Используйте командлет Get-ChildItem с параметром recurse Switched и параметром path (указывает на папку, используемую для справки), чтобы получить коллекцию объектов fileinfo. Храните эти объекты в переменной.
Используйте командлет Get-ChildItem с параметром recurse Switched и параметром path (указывает на папку, используемую для сравнения), чтобы получить коллекцию объектов fileinfo. Сохраните эти объекты в другой переменной.
Используйте командлет Compare-Object и укажите объекты, хранящиеся в первой переменной, для параметра ReferenceObject. Задайте объекты, хранящиеся во второй переменной, параметру DifferenceObject.
Код:
$fso = Get-ChildItem -Recurse -path C:\fso
$fsoBU = Get-ChildItem -Recurse -path C:\template
Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU