Скрипт 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/):

  1. Используйте командлет Get-ChildItem с параметром recurse Switched и параметром path (указывает на папку, используемую для справки), чтобы получить коллекцию объектов fileinfo. Храните эти объекты в переменной.

  2. Используйте командлет Get-ChildItem с параметром recurse Switched и параметром path (указывает на папку, используемую для сравнения), чтобы получить коллекцию объектов fileinfo. Сохраните эти объекты в другой переменной.

  3. Используйте командлет Compare-Object и укажите объекты, хранящиеся в первой переменной, для параметра ReferenceObject. Задайте объекты, хранящиеся во второй переменной, параметру DifferenceObject.

Код:

$fso = Get-ChildItem -Recurse -path C:\fso

$fsoBU = Get-ChildItem -Recurse -path C:\template

Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU
Другие вопросы по тегам