Задать вопрос
@demon_alik
Системный администратор

Перенос файлов в папки год\месяц?

Здравствуйте. Я админ, нужна помощь программистов, не могу создать скрипт на powershell/bat, получается ерунда.
Суть вопроса:
Все файлы из папки А (к примеру) должны быть перемещены в папку B (к примеру). В папке B должна автоматически создаваться папка по дате создания файла с годом (2020 к примеру)или в уже созданной папке года должны создаваться папки месяцев (01, 02 и т.д) или в уже созданные папки месяцев файлы должны быть перенесены по дате создания. В случае обнаружения сходства в имени файла - добавить _1,_2 и т.д. Если есть возможность, скажите пожалуйста эти же условия но папки и перемещения происходят не по дате создания, а по дате изменения файла
  • Вопрос задан
  • 1074 просмотра
Подписаться 2 Средний 2 комментария
Решения вопроса 1
@alhaos
param (
    [System.IO.DirectoryInfo]$sourseDirectory = "C:\Program Files\Far Manager",
    [System.IO.DirectoryInfo]$destinationDirectory = "D:\tmp",
    [int]$useCreationOrModifiedFileDateTimeSwitch = 0 # [0] (Use Creation DateTime) or [1] (Use Modified DateTime)
)

enum CreationOrModifiedFileDateTimeSwitch{
    UseCreationDateTime = 0
    UseModifiedDateTime = 1
}

class FileCopyer{
    hidden [System.IO.DirectoryInfo]$sourseDirectory
    hidden [System.IO.DirectoryInfo]$destinationDirectory
    hidden [CreationOrModifiedFileDateTimeSwitch]$useCreationOrModifiedFileDateTimeSwitch

    FileCopyer([System.IO.DirectoryInfo]$sourseDirectory, [System.IO.DirectoryInfo]$destinationDirectory, [CreationOrModifiedFileDateTimeSwitch]$useCreationOrModifiedFileDateTimeSwitch){
        $this.sourseDirectory = $sourseDirectory
        $this.destinationDirectory = $destinationDirectory
        $this.useCreationOrModifiedFileDateTimeSwitch = $useCreationOrModifiedFileDateTimeSwitch
    }

    [void] CopyFiles() {
        Get-ChildItem -Path $this.sourseDirectory -File | ForEach-Object {
            if ($useCreationOrModifiedFileDateTimeSwitch -eq [CreationOrModifiedFileDateTimeSwitch]::UseModifiedDateTime){
                $year = [int]($_.LastWriteTime.ToString('yyyy'))
                $month = [int]($_.LastWriteTime.ToString('MM'))
            } else {
                $year = [int]($_.CreationTime.ToString('yyyy'))
                $month = [int]($_.CreationTime.ToString('MM'))
            }
            $pathWithYear = Join-Path $this.destinationDirectory -ChildPath $year
            if (!(Test-Path $pathWithYear)) {New-Item $pathWithYear -ItemType Directory}
            $pathWithYearMonth = Join-Path $pathWithYear -ChildPath $month
            if (!(Test-Path $pathWithYearMonth)) {New-Item $pathWithYearMonth -ItemType Directory}
            Copy-Item $_.FullName -Destination $pathWithYearMonth
        }
    }   
}

$FileMoverInstance = [FileCopyer]::New($sourseDirectory, $destinationDirectory, $useCreationOrModifiedFileDateTimeSwitch)
$FileMoverInstance.CopyFiles()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MaxKozlov Куратор тега PowerShell
Та информация что вы получаете командами Get-Item, Get-ChildItem - 'это объекты FileInfo.
https://docs.microsoft.com/ru-ru/dotnet/api/system...
В нем есть свойства CreationTime, LastWriteTime, которые являются объектами DateTime, у них в свою очередь есть свойства Year, Month, Day
Из них можно составить строки
Копировать Copy-Item, проверять существование Test-Path
Без вашего кода больше сказать не получится ибо это будет уже задание. Но поиском найти что-то близкое даже тут можно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы