【问题标题】:How do I Compare Two Folders and Create Missing Subfolders in PowerShell如何在 PowerShell 中比较两个文件夹并创建缺少的子文件夹
【发布时间】:2019-03-21 18:23:34
【问题描述】:

大家好,

在 PowerShell 中,我想比较两个文件夹; [Folder1] 和 [Folder2],对于 [Folder1] 中缺少的每个文件夹,在 [Folder2] 中创建它。我该怎么做?

例如:

> tree .
├───Folder1
│   ├───A0
│   ├───A1
│   ├───B0
│   └───B1
└───Folder2
    ├───A0
    ├───A1
    └───B1

这是我迄今为止尝试过的:

我已经分配了我的源文件夹和目标文件夹,并检索了每个文件夹的列表,如下所示:

$Source = "C:\Temp\Folder1"
$Destination = "C:\Temp\Folder2"
$SrcObj = Get-ChildItem $Source
$DestObj = Get-ChildItem $Destination

然后我比较了这两个文件夹,如下:

Compare-Object -ReferenceObject $SrcObj -DifferenceObject $DestObj

这导致了以下输出:

InputObject  SideIndicator
-----------  -------------
B1           <=

鉴于上面的输出,我认为我可以将 Compare-Object 命令的输出直接通过管道传输到 New-Item cmdlet,但这似乎对我不起作用。

如何实现我的目标 - 即创建目标目录中缺少的“B1”文件夹?

【问题讨论】:

    标签: windows powershell


    【解决方案1】:

    跟随您的方法,并且只在朝向目的地的方向上 你可以这样做:

    $Source      = "C:\Temp\Folder1"
    $Destination = "C:\Temp\Folder2"
    $SrcObj      = Get-ChildItem $Source -Dir
    $DestObj     = Get-ChildItem $Destination -Dir
    
    Compare-Object -Ref $SrcObj -Diff $DestObj -Property Name |
      Where-Object SideIndicator -eq '<=' |
        New-Item -ItemType Directory -Path {Join-Path $Destination $_.Name} -WhatIf
    

    如果输出看起来正常,请删除结尾的 -WhatIf

    【讨论】:

    • 这正是我想要的——谢谢!我喜欢使用 Where-Object 的附加过滤器,以确保我们只朝着目的地的方向前进。另外,感谢您编辑问题并增加清晰度 - 非常感谢。
    【解决方案2】:

    试试这个

    $DirSource="C:\temp\Folder1"
    $DirDestination="C:\temp\Folder2"
    
    Get-ChildItem $DirSource -directory -Recurse | %{New-Item $_.FullName.Replace($DirSource, $DirDestination) -ItemType Directory -Force}
    

    【讨论】:

    • 谢谢。不过,目前正在预约医生,但我会尽早尝试您的建议并提供反馈。
    • 感谢您之前的建议。不幸的是,您的建议完全重新创建了源目录 - 这不是我想要实现的(因为它会覆盖现有文件夹)。
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2022-01-21
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多