【问题标题】:Powershell script to compare folder structure用于比较文件夹结构的 Powershell 脚本
【发布时间】:2018-12-09 15:14:12
【问题描述】:

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


    【解决方案1】:
    # 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
    

    注意-NameGet-ChildItem 的使用,这会导致所有子目录(-Directory-Recurse 被报告为相对于输入目录的路径,这样可以方便地比较目录树。

    另请注意,Compare-Object cmdlet 默认输出具有两个属性的[pscustomobject] 实例,并且仅针对输入集之间的差异

    • .InputObject,在您的情况下是一个输入集唯一的相对目录路径。
    • .SideIndicator,它是一个字符串,指示输入对象是否在 left 侧是唯一的(first 输入集,隐式绑定到参数-ReferenceObject) - @987654332 @ - 或到 right 侧(second 输入集,隐式绑定到参数 -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
    

    【讨论】:

      【解决方案2】:

      要比较两个文件夹,请执行以下步骤(来自:https://blogs.technet.microsoft.com/heyscriptingguy/2011/10/08/easily-compare-two-folders-by-using-powershell/):

      1. 使用带有递归切换参数的 Get-ChildItem cmdlet 和 路径参数(指向用于参考的文件夹)到 获取文件信息对象的集合。将这些对象存储在 多变的。

      2. 使用带有递归切换参数的 Get-ChildItem cmdlet 和 路径参数(指向用于比较的文件夹)到 获取文件信息对象的集合。将这些对象存储在 不同的变量。

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

      代码:

      $fso = Get-ChildItem -Recurse -path C:\fso
      
      $fsoBU = Get-ChildItem -Recurse -path C:\template
      
      Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU
      

      【讨论】:

      • 这不会很好地工作,因为Compare-ObjectSystem.IO.DirectoryInfo 对象与它们的.ToString() 值进行比较,在这种情况下,在Windows PowerShell 中它是仅仅是文件名 .要真正比较两个文件夹树,您必须通过子树中的相对路径比较它们的项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多