Показать полную графическую версию : Доработать скрипт копирования файлов изображений
mihailov_den@vk
18-01-2019, 12:27
Добрый день
Прошу помощи в доработке скрипта. Нужно добавить возможность, чтобы при копировании файлов изображений, они складывались в отдельные папки с датой. Например файл имеет имя 2019-01-15_151941, нужно создать папку 2019.01.15 и положить туда этот файл. Сейчас скрипт копирует файлы в одну кучу. Текст скрипта ниже. Заранее спасибо всем
Set-ExecutionPolicy UnRestricted
CLS
$Dest1 = "C:\foto1"
$Dest2 = "C:\foto2"
#Write-Host "!!!!____!!!! Приступаем к проверке папки 1"
ForEach ($File in (Get-ChildItem $Dest1 -Recurse))
{
# Write-host "Обрабатываю" $File.fullname $File.LastWriteTime
$Dest1ToDest2= $File.FullName.Replace($Dest1, $Dest2)
if ((Test-Path -path $Dest1ToDest2) -ne $True)
{
# Write-host "_______________Файла в Папке 2 не существует. Нужно скопировать из Папки 1"
Copy-Item $File.FullName $Dest1ToDest2 -Force
}
Else
{
if ((Dir $File.FullName).LastWriteTime -gt (Dir $Dest1ToDest2).LastWriteTime)
{
# Write-Host "_______________Файл в папке 1 новее, чем в папке 2. Нужно скопировать"
Copy-Item $File.FullName $Dest1ToDest2 -Force
}
Else
{
# Write-Host "_______________Файлы одинаковые. Обновление не требуется"
}
}
}
#Write-Host "!!!!____!!!! Приступаем к проверке папки 2"
ForEach ($File in (Get-ChildItem $Dest2 -Recurse))
{
# Write-host "Обрабатываю" $File.fullname $File.LastWriteTime
$Dest2ToDest1= $File.FullName.Replace($Dest2, $Dest1)
if ((Test-Path -path $Dest2ToDest1) -ne $True)
{
# Write-Host "_______________Файл не существует в Папке1. Нужно удалить из папки 2"
Remove-Item $File.FullName -Force
}
else
{
# Write-Host "_______________Файл существует в Папке1."
}
}
Set-ExecutionPolicy Restricted
dbillika
18-01-2019, 13:55
Не знаю как в Повершеле, но в обычном bat это делается так(найдено на просторах интернетов):
@echo off
setlocal enabledelayedexpansion
set SourceRoot=%CD%
set TargetRoot=%CD%/1
set FileMask=*.*
for /r "%SourceRoot%" %%a in (%FileMask%) do (
echo Processing [%%~ta] %%~fa
for /f "tokens=1-3 delims=. " %%f in ("%%~ta") do (
set DD=%%f
set MM=%%g
set YYYY=%%h
)
set TargetFolder=!YYYY! !MM! !DD!
if not exist "%TargetRoot%\!TargetFolder!" md "%TargetRoot%\!TargetFolder!"
move "%%~fa" "%TargetRoot%\!TargetFolder!"
)
pause
Поправляешь пути и вуаля. Сортировка файлов в отдельные папки по дате их создания.
mihailov_den@vk
18-01-2019, 17:59
Copy-Item $File.FullName $Dest1ToDest2 -Force
Вот эта часть кода отвечает за копирование в папку. Пробовал дописать, чтобы создавалась папка с датой файла
Get-ChildItem -File | Copy-Item -Destination { md ("C:\Files\" + $_.LastWriteTime.ToString("yyyy.MM.dd")) -Force}
не работает (((
Прошу помощи »
чем ковырять чужой код и разбираться с тем, что же он должен делать, проще написать новый...
Сформулируйте, по пунктам, всю задачу, которую Вы хотите решить.
mihailov_den@vk
21-01-2019, 08:08
Есть папка, в которую каждый день складываются скриншоты. необходимо написать скрипт, который будет копировать каждый день эти скриншоты в другую папку по сети, раскладывая их в папки по дате создания. Скриншоты будут хранится n-время, чтобы каждый раз не копировать все файлы, нужна проверка по дате, чтобы копировались только новые
раскладывая их в папки по дате создания. »
Дата создания... эту дату надо брать из параметров файла или из названия?
Если дата из параметров файла, то:
1. Дата создания файла после копирования станет текущей, т.е. будет изменена по правилам файловой системы, в новом, скопированном файле.
2. Если требуется сохранение даты, то использовать необходимо дату последнего изменения, она при копировании не изменяется.
Если дата из названия файла, то:
1. Всегда ли формат даты единый?
2. Какой именно формат присутствует?
Скриншоты будут хранится n-время, чтобы каждый раз не копировать все файлы, нужна проверка по дате, чтобы копировались только новые »
Этот пункт будет зависеть от выбора типа проверяемой даты.
mihailov_den@vk
21-01-2019, 11:14
Дату можно брать из названия файла. Формат даты 2019-01-20 , единый
Дату можно брать из названия файла. Формат даты 2019-01-20 , единый »
т.е. у всех файлов, созданных в один день, имена одинаковые? В файловой системе такой коллизии существовать не может, файлы будут просто перезаписывать один и тот же файл:
2019-01-20.jpg
Ок, примем за формат имен файлов это:
файл имеет имя 2019-01-15_151941 »
т.е. yyyy-MM-dd_HHmmss
тогда скрипт будет примерно таким:
$src = 'TEST1'
$dst = 'TEST2'
$flt = '*.*'
dir $src -filt $flt -file|%{
$fname = $_.name
try {
$dstf = $dst + '\' + (
'{0:yyyy_MM_dd}' -f ([datetime]::parseexact($_.basename, 'yyyy-MM-dd_HHmmss', $null))
)
if (!(test-path $dstf -patht container)){md $dstf|out-null}
if (test-path ($a = $dstf+'\'+$_.name) -patht leaf){
if ($_.lastwritetime -gt (gi $a).lastwritetime){
cp $_.fullname $dstf -force
}
} else {cp $_.fullname $dstf}
} catch {
write-host 'Произошла ошибка! Проверьте формат даты в имени файла: ' -for red -non
write-host $fname -for cyan
}
}
mihailov_den@vk
21-01-2019, 12:39
файл имеет имя 2019-01-15_151941 »
т.е. yyyy-MM-dd_HHmmss
Да всё верно, добавляется еще время создания файла
Спасибо, Ваш скрипт проверил, работает
последние 6 цифр меняются, эта нумерация создаются программой, которая делает скрин шоты. »
Скорее всего, это всё же, не просто нумерация, а именно HHmmss (сейчас в скрипте это учтено и дата используется только для формирования целевого каталога), но по сути, это не имеет большого значения...
Может тогда лучше проверять файл по дате создания? »
Можно как угодно, потому и просил условия задачи, по возможности, наиболее полные...
Можно регуляркой отрезать "лишнее" из имени файла и оставить только дату, можно брать дату из параметра файла LastWriteTime... в общем, это только Вам решать, что требуется.
Да, речь идет именно об использовании даты для создания целевых каталогов.
Но тут другое интересует... В том скрипте, который Вы приводили выше, присутствует такая запись:
Файл в папке 1 новее, чем в папке 2. Нужно скопировать" »
Если я правильно понял, то при наличии одноименного файла в целевом каталоге, требуется проверка на "свежесть" файла? Это в моем скрипте не реализовано.
Если это требуется, то можно реализовать, но в этой проверке будут сравниваться только LastWriteTime, ибо проверка на "свежесть" наиболее корректна будет именно по этой дате...
mihailov_den@vk
21-01-2019, 13:03
да, все верно
Если я правильно понял, то при наличии одноименного файла в целевом каталоге, требуется проверка на "свежесть" файла? Это в моем скрипте не реализовано.
Если это требуется, то можно реализовать, но в этой проверке будут сравниваться только LastWriteTime, ибо проверка на "свежесть" наиболее корректна будет именно по этой дате...
Да, в этом скрипте есть проверка на свежесть. Если не затруднит. доработайте ваш скрипт с этим условием
Да, в этом скрипте есть проверка на свежесть. Если не затруднит. доработайте ваш скрипт с этим условием »
Fixed
mihailov_den@vk
21-01-2019, 14:08
Огромное спасибо
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.