@Sunvortex

Как перемещать файлы с заданными характеристиками?

Добрый день!
Изначальная задача - очистка файлового сервера от старых файлов.
Разбил ее на 2 этапа, на первом формирую через powershell csv со списком файлов у которых LastAccessTime и LastWriteTime больше двух лет, получаю файл с примерно 3000000 строк.
Для второго этапа набросал вот такой скрипт, если вкратце, берет строку, меняет ее начало, отрезает имя файла и результат использует в качестве папки назначения, скрипт еще попутно ведет лог того что перенесено (потом добавили условие что ексельки не надо переносить).
$Paths = Import-Csv -Path ‘C:\temp\OldFiles.csv’ -Delimiter ‘;’
$Paths = $Paths.FullName
$Copylog = «C:\temp\copylog_all.csv»
foreach ($Path in $Paths){
	foreach ( $Newpath in $Path){
		If ($Path.Substring(0,2) -eq «\\») {$Newpath = («\\?\Y:» + $Path.Remove(0,12))}
		$Destpath = Split-Path $Newpath -Parent
		$Item = Move-Item -Path $Path -Destination $Destpath -Exclude *.xl* -PassThru -Verbose
		$Item |Select-Object fullname | Export-Csv -Force -Path $Copylog -Encoding UTF8 -Delimiter «;» -NoTypeInformation -Append
	}
}

путь в файле примерно такого вида
«\\?\D:\00000\111111\2222\33333\44444\55555\6666\777777\888888.pdf»
Структура папок на новом диске полностью перенесена со всеми группами доступа.

Проблема в том что PowerShell обрабатывает этот скрипт очень медленно, за 2 недели прошел порядка 1кк строк.

Пытался использовать foreach-object -paralell, но в workflow мой скрипт просто ничего не делает.

Главный вопрос: "Как ускорить процесс переноса?"
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 3
@MaxKozlov Куратор тега PowerShell
Избавляться надо от ненужных преобразований типа $Paths = $Paths.FullName
От вложенного цикла надо избавляться. N^2 однако. Если он там, конечно есть
Так как нет примера того что у вас в csv, непонятно зачем он нужен вообще
по тексту у вас вроде как во внешнем $Path должна быть уже просто строка
Почему вы её ещё раз перебираете как foreach ( $Newpath in $Path) ?

Ну и мувать с -Exclude *.xl* тоже странно, проще проверить на xl* в коде, чем заставлять этим заниматься move-item. Может быть, вы ps заставляете по новой весь каталог обшаривать таким образом, а в нём 10000 файлов xls

Плюс, логи на каждый мув могут вас тормозить

-Passthru на move-item излишен, он может заставлять по новой читать параметры файла с диска, а вам от него нужен только новый полный путь, который вы и так знаете

А вообще я бы каталоги целиком таскал, по крайней мере на первом проходе.
Судя по количеству ваших файлов, там большущая помойка.
Ответ написан
Комментировать
hint000
@hint000
у админа три руки
Я бы делал в 2 этапа:
(1) выборочный перенос в папку на том же диске;
(2) перенос на другой диск целиком одной большой папки, сформированной на первом этапе.
Ответ написан
Комментировать
@Sunvortex Автор вопроса
Переписал первый скрипт так чтобы он и фильтровал и создавал новый путь, выход scv теперь имеет такой вид:
"FullName";"NewPath"
"\\?\C:\Users\vasya.pupkin\Downloads\shared-doc\copylog.csv";"\\?\C:\TEST\Downloads\shared-doc"
"\\?\C:\Users\vasya.pupkin\Downloads\shared-doc\copylog_legal.csv";"\\?\C:\TEST\Downloads\shared-doc"
...

Идея перемещать еще в 2 этапа, мне кажется вполне может ускорить процесс, как минимум тем что 2 этап можно осуществить через robocopy.
Но вот по первому этапу есть вопрос, как осуществить перенос с созданием структуры так чтобы не потерять все группы доступа? Опять разбить на 2 этапа, создать структуру с помощью robocopy и потом переносить? Или можно реализовать сразу в процессе перемещения в папку на диске?
Ответ написан
Ваш ответ на вопрос

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

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