Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Доработать скрипт копирования файлов изображений (http://forum.oszone.net/showthread.php?t=338797)

mihailov_den@vk 18-01-2019 12:27 2853099

Доработать скрипт копирования файлов изображений
 
Добрый день
Прошу помощи в доработке скрипта. Нужно добавить возможность, чтобы при копировании файлов изображений, они складывались в отдельные папки с датой. Например файл имеет имя 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 2853114

Не знаю как в Повершеле, но в обычном 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 2853141

Copy-Item $File.FullName $Dest1ToDest2 -Force

Вот эта часть кода отвечает за копирование в папку. Пробовал дописать, чтобы создавалась папка с датой файла
Get-ChildItem -File | Copy-Item -Destination { md ("C:\Files\" + $_.LastWriteTime.ToString("yyyy.MM.dd")) -Force}

не работает (((

YuS_2 18-01-2019 19:20 2853158

Цитата:

Цитата mihailov_den@vk
Прошу помощи »

чем ковырять чужой код и разбираться с тем, что же он должен делать, проще написать новый...
Сформулируйте, по пунктам, всю задачу, которую Вы хотите решить.

mihailov_den@vk 21-01-2019 08:08 2853507

Есть папка, в которую каждый день складываются скриншоты. необходимо написать скрипт, который будет копировать каждый день эти скриншоты в другую папку по сети, раскладывая их в папки по дате создания. Скриншоты будут хранится n-время, чтобы каждый раз не копировать все файлы, нужна проверка по дате, чтобы копировались только новые

YuS_2 21-01-2019 09:39 2853513

Цитата:

Цитата mihailov_den@vk
раскладывая их в папки по дате создания. »

Дата создания... эту дату надо брать из параметров файла или из названия?
Если дата из параметров файла, то:
1. Дата создания файла после копирования станет текущей, т.е. будет изменена по правилам файловой системы, в новом, скопированном файле.
2. Если требуется сохранение даты, то использовать необходимо дату последнего изменения, она при копировании не изменяется.

Если дата из названия файла, то:
1. Всегда ли формат даты единый?
2. Какой именно формат присутствует?

Цитата:

Цитата mihailov_den@vk
Скриншоты будут хранится n-время, чтобы каждый раз не копировать все файлы, нужна проверка по дате, чтобы копировались только новые »

Этот пункт будет зависеть от выбора типа проверяемой даты.

mihailov_den@vk 21-01-2019 11:14 2853527

Дату можно брать из названия файла. Формат даты 2019-01-20 , единый

YuS_2 21-01-2019 11:55 2853535

Цитата:

Цитата mihailov_den@vk
Дату можно брать из названия файла. Формат даты 2019-01-20 , единый »

т.е. у всех файлов, созданных в один день, имена одинаковые? В файловой системе такой коллизии существовать не может, файлы будут просто перезаписывать один и тот же файл:
2019-01-20.jpg

Ок, примем за формат имен файлов это:
Цитата:

Цитата mihailov_den@vk
файл имеет имя 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 2853547

файл имеет имя 2019-01-15_151941 »
т.е. yyyy-MM-dd_HHmmss

Да всё верно, добавляется еще время создания файла

Спасибо, Ваш скрипт проверил, работает

YuS_2 21-01-2019 12:52 2853550

Цитата:

Цитата mihailov_den@vk
последние 6 цифр меняются, эта нумерация создаются программой, которая делает скрин шоты. »

Скорее всего, это всё же, не просто нумерация, а именно HHmmss (сейчас в скрипте это учтено и дата используется только для формирования целевого каталога), но по сути, это не имеет большого значения...

Цитата:

Цитата mihailov_den@vk
Может тогда лучше проверять файл по дате создания? »

Можно как угодно, потому и просил условия задачи, по возможности, наиболее полные...
Можно регуляркой отрезать "лишнее" из имени файла и оставить только дату, можно брать дату из параметра файла LastWriteTime... в общем, это только Вам решать, что требуется.
Да, речь идет именно об использовании даты для создания целевых каталогов.

Но тут другое интересует... В том скрипте, который Вы приводили выше, присутствует такая запись:
Цитата:

Цитата mihailov_den@vk
Файл в папке 1 новее, чем в папке 2. Нужно скопировать" »

Если я правильно понял, то при наличии одноименного файла в целевом каталоге, требуется проверка на "свежесть" файла? Это в моем скрипте не реализовано.
Если это требуется, то можно реализовать, но в этой проверке будут сравниваться только LastWriteTime, ибо проверка на "свежесть" наиболее корректна будет именно по этой дате...

mihailov_den@vk 21-01-2019 13:03 2853554

да, все верно

Если я правильно понял, то при наличии одноименного файла в целевом каталоге, требуется проверка на "свежесть" файла? Это в моем скрипте не реализовано.
Если это требуется, то можно реализовать, но в этой проверке будут сравниваться только LastWriteTime, ибо проверка на "свежесть" наиболее корректна будет именно по этой дате...

Да, в этом скрипте есть проверка на свежесть. Если не затруднит. доработайте ваш скрипт с этим условием

YuS_2 21-01-2019 13:16 2853556

Цитата:

Цитата mihailov_den@vk
Да, в этом скрипте есть проверка на свежесть. Если не затруднит. доработайте ваш скрипт с этим условием »

Fixed

mihailov_den@vk 21-01-2019 14:08 2853567

Огромное спасибо


Время: 18:09.

Время: 18:09.
© OSzone.net 2001-