Вопрос или проблема
Я хочу скопировать из исходной папки dir в желаемое место назначения, как показано ниже.
Исходная папка:
--Dummy
----dirA (содержит файлы, измененные 2/7/2015)
----dirB (содержит файлы, измененные 3/7/2015)
----dirC (содержит файлы, измененные 18/7/2015)
----dirD (содержит файлы, измененные 18/7/2015)
----dirE (содержит файлы, измененные 2/7/2015)
Каждая dir
выше в Dummy содержит файлы с конкретной датой последнего изменения
Папка назначения должна выглядеть следующим образом:
--Dummy2015-07-2
----dirA (содержит файлы, измененные 2/7/2015)
----dirE (содержит файлы, измененные 2/7/2015)
--Dummy2015-07-3
----dirB (содержит файлы, измененные 3/7/2015)
--Dummy2015-07-18
----dirC (содержит файлы, измененные 18/7/2015)
----dirD (содержит файлы, измененные 18/7/2015)
До сих пор, ссылаясь на здесь, я смог создать что-то вроде этого:
$sourcePath="c:/dummy"
$destPath="e:/dummy"
Get-ChildItem -recurse -Path $sourcePath | Group {$_.LastWriteTime.ToString("yyyy-MM-dd")} |
Foreach-Object{
$folder = New-Item -Path "$($destPath)$($_.Name)" -ItemType Directory -Force
$_.Group | Where-Object { -not (Test-Path "$($folder.FullName)\$($_.Name)") } | Copy-Item -Destination $folder.FullName
}
Но приведенный выше код напрямую копирует файлы из папки исходного дубликата, что делает папку назначения следующей:
--Dummy2015-07-2
----(все файлы из dirA & dirE)
--Dummy2015-07-3
----(все файлы из dirB)
--Dummy2015-07-18
----(все файлы из dirC & dirD)
(если возможно, хотелось бы сделать это с помощью robocopy)
Содержит ли dirA только файлы, измененные 2015.07.02? Или она содержит файлы, измененные раньше? В своем ответе я предполагаю первое. Я также буду предполагать, что каждая папка содержит только файлы или папки, которые вы хотите связать с этой же папкой (т.е. вы не переместите их из родительской папки).
Ниже приведен код, который должен работать. Заполните первые 2 переменные.
И эй, он использует robocopy
! 🙂
$PathToRootOfDummy = "C:\path\to\dummy\root"
$PathToReplacementPrefix = "C:\path\to\dummy_new-" # дата идет после '-'
Get-ChildItem $PathToRootOfDummy | Where-Object {$_.PSISContainer -eq $true} | ForEach-Object {
$nf = "$PathToReplacementPrefix$($(Get-ChildItem -Path $PathToRootOfDummy\$($_.Name) | Where { ! $_.PSIsContainer} )[0].LastWriteTime.tostring("yyyy-MM-dd"))"
mkdir $nf
robocopy -s -e $PathToRootOfDummy\$_ $nf
}
Ответ или решение
Копирование файлов на основе даты последнего изменения с использованием PowerShell и Robocopy
Введение
Вам необходимо организовать файлы из нескольких подкаталогов в новую структуру директории на основе их даты последнего изменения. Важно правильно сгруппировать файлы так, чтобы файлы, модифицированные в одну и ту же дату, находились в одном и том же каталоге. В этом руководстве мы рассмотрим, как это сделать с помощью PowerShell и Robocopy.
Исходные данные
Исходная директория:
--Dummy
----dirA (файлы последнего изменения 2/7/2015)
----dirB (файлы последнего изменения 3/7/2015)
----dirC (файлы последнего изменения 18/7/2015)
----dirD (файлы последнего изменения 18/7/2015)
----dirE (файлы последнего изменения 2/7/2015)
Структура целевой директории:
--Dummy2015-07-02
----dirA
----dirE
--Dummy2015-07-03
----dirB
--Dummy2015-07-18
----dirC
----dirD
Решение с использованием PowerShell и Robocopy
Вы можете использовать следующий скрипт PowerShell для достижения ваших целей. Скрипт организует файлы в структуру директорий на основе даты их последнего изменения:
$sourcePath = "C:\path\to\Dummy"
$destPath = "E:\path\to\DummyNew-" # добавьте дату после '-'
# Получаем все подкаталоги в исходной директории
Get-ChildItem -Path $sourcePath -Directory | ForEach-Object {
$lastModifiedDate = (Get-ChildItem -Path $_.FullName | Where-Object { -not $_.PSIsContainer }).LastWriteTime.ToString("yyyy-MM-dd")
$destinationDir = Join-Path -Path $destPath -ChildPath $lastModifiedDate
# Создаем новую директорию на основе даты последнего изменения
if (-not (Test-Path $destinationDir)) {
New-Item -Path $destinationDir -ItemType Directory
}
# Копируем файлы в соответствующий каталог
robocopy $_.FullName $destinationDir /E /COPY:DAT /NFL /NDL
}
Объяснение кода
-
Определение путей: Мы задаем пути к исходной и целевой директориям. Обратите внимание, что целевой путь содержит базу для нового имени директории.
-
Получение подкаталогов: Используется
Get-ChildItem
для получения всех подкаталогов из исходной директории. -
Получение даты последнего изменения: Для каждого подкаталога вычисляется дата последнего изменения, используя
LastWriteTime
. -
Создание новой директории: Если директория не существует, она создаётся с помощью
New-Item
. -
Копирование файлов: Используется
Robocopy
, чтобы скопировать файлы из исходного подкаталога в новую директорию. Опции/E
и/COPY:DAT
обеспечивают полное копирование директорий и соответствующих атрибутов.
Примечание
Убедитесь, что у вас есть необходимые разрешения на доступ к директориям и что выполняется скрипт с соответствующими правами.
Заключение
Данный подход позволяет автоматически организовать ваши файлы в новой структуре директорий на основе даты последних изменений. Использование PowerShell в сочетании с Robocopy предоставляет мощный инструмент для облегчения задач администрирования файлов в Windows. Если у вас есть дополнительные вопросы или вам требуется дальнейшая помощь, не стесняйтесь обращаться.