Скрипт Powershell для сравнения структуры папок - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь написать сценарий 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 ]

0 голосов
/ 09 декабря 2018

Чтобы сравнить две папки, выполните следующие действия (из: 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 и параметром 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
0 голосов
/ 09 декабря 2018
# 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, который представляет собой строку, указывающую, был ли входной объект уникальнымсо стороны слева (входной набор first , неявно связанный с параметром -ReferenceObject) - '<=' - или со стороны right ( второй входной набор, неявно связанный с параметром -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...