|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Доработать скрипт копирования файлов изображений |
|
|
PowerShell - Доработать скрипт копирования файлов изображений
|
Новый участник Сообщения: 7 |
Добрый день
Прошу помощи в доработке скрипта. Нужно добавить возможность, чтобы при копировании файлов изображений, они складывались в отдельные папки с датой. Например файл имеет имя 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 |
|
Отправлено: 12:27, 18-01-2019 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Не знаю как в Повершеле, но в обычном 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 |
Отправлено: 13:55, 18-01-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 7
|
Профиль | Сайт | Отправить PM | Цитировать Copy-Item $File.FullName $Dest1ToDest2 -Force
Вот эта часть кода отвечает за копирование в папку. Пробовал дописать, чтобы создавалась папка с датой файла Get-ChildItem -File | Copy-Item -Destination { md ("C:\Files\" + $_.LastWriteTime.ToString("yyyy.MM.dd")) -Force} не работает ((( |
Отправлено: 17:59, 18-01-2019 | #3 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата mihailov_den@vk:
Сформулируйте, по пунктам, всю задачу, которую Вы хотите решить. |
|
------- Отправлено: 19:20, 18-01-2019 | #4 |
Новый участник Сообщения: 7
|
Профиль | Сайт | Отправить PM | Цитировать Есть папка, в которую каждый день складываются скриншоты. необходимо написать скрипт, который будет копировать каждый день эти скриншоты в другую папку по сети, раскладывая их в папки по дате создания. Скриншоты будут хранится n-время, чтобы каждый раз не копировать все файлы, нужна проверка по дате, чтобы копировались только новые
|
|
Отправлено: 08:08, 21-01-2019 | #5 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата mihailov_den@vk:
Если дата из параметров файла, то: 1. Дата создания файла после копирования станет текущей, т.е. будет изменена по правилам файловой системы, в новом, скопированном файле. 2. Если требуется сохранение даты, то использовать необходимо дату последнего изменения, она при копировании не изменяется. Если дата из названия файла, то: 1. Всегда ли формат даты единый? 2. Какой именно формат присутствует? Цитата mihailov_den@vk:
|
||
------- Отправлено: 09:39, 21-01-2019 | #6 |
Новый участник Сообщения: 7
|
Профиль | Сайт | Отправить PM | Цитировать Дату можно брать из названия файла. Формат даты 2019-01-20 , единый
|
Отправлено: 11:14, 21-01-2019 | #7 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата mihailov_den@vk:
2019-01-20.jpg Ок, примем за формат имен файлов это: Цитата mihailov_den@vk:
тогда скрипт будет примерно таким: $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 } } |
||
------- Последний раз редактировалось YuS_2, 21-01-2019 в 13:15. Причина: добавлено сравнение даты изменения одноименных файлов Отправлено: 11:55, 21-01-2019 | #8 |
Новый участник Сообщения: 7
|
Профиль | Сайт | Отправить PM | Цитировать файл имеет имя 2019-01-15_151941 »
т.е. yyyy-MM-dd_HHmmss Да всё верно, добавляется еще время создания файла Спасибо, Ваш скрипт проверил, работает |
Последний раз редактировалось mihailov_den@vk, 21-01-2019 в 12:47. Отправлено: 12:39, 21-01-2019 | #9 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата mihailov_den@vk:
Цитата mihailov_den@vk:
Можно регуляркой отрезать "лишнее" из имени файла и оставить только дату, можно брать дату из параметра файла LastWriteTime... в общем, это только Вам решать, что требуется. Да, речь идет именно об использовании даты для создания целевых каталогов. Но тут другое интересует... В том скрипте, который Вы приводили выше, присутствует такая запись: Цитата mihailov_den@vk:
Если это требуется, то можно реализовать, но в этой проверке будут сравниваться только LastWriteTime, ибо проверка на "свежесть" наиболее корректна будет именно по этой дате... |
|||
------- Отправлено: 12:52, 21-01-2019 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Любой язык - [решено] Скрипт для копирования файлов/папок с заменой | darkAge | Скриптовые языки администрирования Windows | 19 | 01-07-2013 18:06 | |
CMD/BAT - bat-скрипт для массового копирования файлов | akt | Скриптовые языки администрирования Windows | 3 | 02-05-2013 17:26 | |
CMD/BAT - Скрипт копирования файлов и папок в сети в дерикторию пользователей | DNKolian | Скриптовые языки администрирования Windows | 2 | 18-02-2013 10:52 | |
CMD/BAT - [решено] Скрипт сортировки и копирования файлов по маске | Daemonstar | Скриптовые языки администрирования Windows | 2 | 25-09-2010 15:47 | |
Скрипт для копирования файлов с 1 сервера на несколько | andro_id | Программирование в *nix | 2 | 04-09-2008 11:48 |
|