【问题标题】:Merge folders by moving their files and folders recursively通过递归移动文件和文件夹来合并文件夹
【发布时间】:2021-01-18 21:09:25
【问题描述】:

有两个文件夹:test1 和 test2。两者具有相同的结构、文件和扩展名,但内容不同。 我想将 test1 文件夹中的所有文件夹和文件移动(合并)到符合其结构的另一个文件夹中。

test1 和 test2 文件夹结构

D:\test1\friends\1.txt
D:\test1\graphics\1.txt
D:\test1\public\1.txt
D:\test1\resource\1.txt
D:\test1\servers\1.txt
D:\test1\steam\1.txt

【问题讨论】:

  • Move-Item "D:\test1\*" "D:\test2" -- 这是你想要的吗?
  • 它只会将所有文件移动到文件夹的根目录。
  • 它对我有用。删除Get-ChildItemForEach-Object。仅致电Move-Item

标签: powershell


【解决方案1】:
<#
    .SYNOPSIS
        Копирование или псевдоперемещение файлов и каталогов с сохранением структуры

    .Description
        Скрипт предназначен для копирования или перемещения файлов из одного каталога
        в другой, при этом сохраняется вложенная структура каталогов. Фактически,
        перемещение не выполняется, вместо него работает копирование с последующим
        удалением скопированнных итемов.

    .Parameter Source
        Необязательный: Исходный каталог для выборки элементов. Указывается либо
        относительный, либо абсолютный путь.

    .Parameter Destination
        Необязательный: Целевой каталог. Указывается либо относительный, либо
        абсолютный путь.

    .Parameter Include
        Необязательный: маска(и) для включения элементов в выборку

    .Parameter Exclude
        Необязательный: маска(и) для исключения элементов из выборки

    .Parameter Delete
        Переключатель: Если указан, то будут удалены исходные файлы, включенные в выборку,
        рекурсивно

    .Parameter DeleteEmpty
        Переключатель: Если указан, то будут удалены рекурсивно пустые подкаталоги в исходном каталоге

    .Example
        .\script.ps1 -Source "D:\FOLDER1" -Destination "d:\Folder2" -Include '*.pdf', '*.txt' -Exclude '*_out.*' -Delete

        Это пример перемещения файлов по маскам '*.pdf','*.txt' с исключением из выборки по маске
        '*_out.*', с последующим удалением исходных элементов. Пустые каталоги не удаляются

    .Example
        .\script.ps1

        Это пример копирования/перемещения файлов/каталогов, с сохранением структуры, но
        по указанным в самом скрипте параметрам...

    .Link
        https://forum.ru-board.com/topic.cgi?forum=62&topic=30859&start=3600#4

    .Notes
        Created By YuS

        Version: 1.00
        Date: 20.01.2021
#>
function Move-Recursively
{
    [CmdletBinding()]
    param
    (
        [string]
        $Source,

        [string]
        $Destination,

        [string[]]
        $Include = '*.*',

        [string[]]
        $Exclude = '',

        [switch]
        $Delete,

        [switch]
        $DeleteEmpty
    )
    $src = Get-Item -LiteralPath $Source -Force

    # перемещение файлов с сохранением структуры
    Get-ChildItem -LiteralPath $src.fullname -Include $Include -Exclude $Exclude -Recurse -Force | Copy-Item -Destination {
        $Folder = Split-Path -Path $_.FullName.Replace("$($src.FullName)",$Destination)
        if (-not (Test-Path -LiteralPath $Folder))
        {
            New-Item -Path $Folder -ItemType Directory -Force
        }
        else
        {
            $Folder
        }
    } -Force #-whatif

    if ($Delete.IsPresent)
    {
        # удаляем все скопированные файлы
        Get-ChildItem -LiteralPath $src.FullName  -Include $Include -Exclude $Exclude -Recurse -Force -File | Remove-Item -Recurse -Force
    }
    if ($DeleteEmpty.IsPresent)
    {
        # удаляем пустые каталоги
        Get-ChildItem -LiteralPath $src.FullName -Recurse -Directory -Force | Sort-Object {$_.FullName.Length} -Descending | ForEach-Object -Process {
            if ($null -eq (Get-ChildItem -LiteralPath $_.FullName -Recurse -force))
            {
                Remove-Item -LiteralPath $_.FullName -Force
            }
        }
    }
}

$Source = "$DownloadsFolder\Metro\UPMetroSkin-master\Unofficial 4.x Patch\Main Files [Install First]"
$Destination = "$DownloadsFolder\Metro\metro-for-steam-4.4"

Move-Recursively -Source $Source -Destination $Destination -Delete

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 2021-03-04
    • 2013-06-03
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多