用于比较文件夹结构的Powershell脚本

用于比较文件夹结构的Powershell脚本,powershell,directory,compareobject,Powershell,Directory,Compareobject,我正在尝试编写一个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丢失 任何帮助都将不胜感激 #

我正在尝试编写一个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丢失

任何帮助都将不胜感激

# 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
)报告为相对于输入目录的路径,从而方便目录树之间的比较

还请注意,cmdlet默认输出具有两个属性的
[pscustomobject]
实例,并且仅用于输入集之间的差异:

  • .InputObject
    ,在您的情况下,是一个输入集唯一的相对目录路径
  • .SideIndicator
    ,它是一个字符串,指示输入对象对于左侧是否唯一(第一个输入集,隐式绑定到参数
    -ReferenceObject
    )-
    '
上述结果类似于:

InputObject SideIndicator
----------- -------------
C           =>             # folder C only in dir. 1, not in template dir.
---
B           <=             # folder B only in template dir., not in dir. 2
InputObject侧指示器
----------- -------------
C=>#文件夹C仅在目录1中,不在模板目录中。
---

B要比较两个文件夹,请执行以下步骤(从:):

  • 将Get-ChildItem cmdlet与递归切换参数一起使用,并 路径参数(指向要用于引用的文件夹)将 获取fileinfo对象的集合。将这些对象存储在 变数

  • 将Get-ChildItem cmdlet与递归切换参数一起使用,并 路径参数(指向用于比较的文件夹)将 获取fileinfo对象的集合。将这些对象存储在 不同的变量

  • 使用Compare-Object cmdlet并指定存储在中的对象 ReferenceObject参数的第一个变量。提供对象 存储在DifferenceObject参数的第二个变量中

  • 代码:


    这不会有效,因为
    Compare Object
    通过
    .ToString()
    值来比较
    System.IO.DirectoryInfo
    对象,在Windows PowerShell中,该值仅是文件名。要真正比较两个文件夹树,必须通过它们在子树中的相对路径来比较它们的项。
    $fso = Get-ChildItem -Recurse -path C:\fso
    
    $fsoBU = Get-ChildItem -Recurse -path C:\template
    
    Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU