PowerShell · 04.04.2023

Перемещение в иерархию

Где-то на файловом сервере есть папка, куда пользователи и/или устройства сливают файлы не придерживаясь иерархии. Такие папки в какой-то момент накапливают знатный баласт и разобраться в куче файлов — та ещё задачка.

Дабы навести порядок, решил провести сортировку по датам в виде иерархии папок «ГГГГ\ММ» с помощью такого скрипта:

## Заголовок скрипта ##
[System.Console]::Title="Перемещение и сортировка файлов"

## Путь целевой папки ##
$source = Read-Host "Путь целевой папки"
Write-Host
Write-Host "ВНИМАНИЕ!" -ForegroundColor Red
Write-Host "Все файлы находящиеся в размещении $source будут перемещены!" -ForegroundColor Yellow

## Путь папки адресата ##
# Иерархия формируется на рабочем столе текущего пользователя #
# $destination = [Environment]::GetFolderPath("Desktop") # <== Для перемещения на рабочий стол
$destination = $source
Write-Host "Иерархия будет создана здесь: $destination" -ForegroundColor Green
Write-Host

## Спим 15 секунд ##
$countdown = (get-date).addSeconds(15)
Write-Host "Запуск скрипта через:" -ForegroundColor Yellow
while ( (get-date) -lt $countdown )
{
   Write-Host "$("{0}" -f ([int](new-timespan $(get-date) $countdown).totalseconds))" -ForegroundColor Yellow
   Start-Sleep -Seconds 1
}

## Создание иерархии и перемещение файлов ##
Write-Host
$objs = Get-ChildItem -File $source -Recurse -Force
ForEach ($obj in $objs)
{
    Write-Host
    $obj | Move-Item -Force `
    -Destination { 
       New-Item -ItemType Directory ("$destination\" + $_.LastWriteTime.ToString("yyyy") + "\" + $_.LastWriteTime.ToString("MM")) `
       -Force -ErrorAction Ignore -Verbose } `
    -Verbose
}

## Ожидание действия пользователя ##
Write-Host
Read-Host "Нажмите на любую клавишу для выхода..."

Отдельно обращаю Ваше внимание, что специально создал переменную $destination, чтобы можно было манипулировать местом назначения. А ещё добавил обратный отсчёт.