Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Доработать скрипт копирования файлов изображений

Ответить
Настройки темы
PowerShell - Доработать скрипт копирования файлов изображений

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Профиль | Отправить 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
Благодарности: 0

Профиль | Сайт | Отправить 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


Аватара для YuS_2

Старожил


Сообщения: 302
Благодарности: 114

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire


Отправлено: 19:20, 18-01-2019 | #4


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 08:08, 21-01-2019 | #5


Аватара для YuS_2

Старожил


Сообщения: 302
Благодарности: 114

Профиль | Отправить PM | Цитировать


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

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

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

-------
scio me nihil scire


Отправлено: 09:39, 21-01-2019 | #6


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 11:14, 21-01-2019 | #7


Аватара для YuS_2

Старожил


Сообщения: 302
Благодарности: 114

Профиль | Отправить PM | Цитировать


Цитата 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
	}
}

-------
scio me nihil scire


Последний раз редактировалось YuS_2, 21-01-2019 в 13:15. Причина: добавлено сравнение даты изменения одноименных файлов

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:55, 21-01-2019 | #8


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

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

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

Последний раз редактировалось mihailov_den@vk, 21-01-2019 в 12:47.


Отправлено: 12:39, 21-01-2019 | #9


Аватара для YuS_2

Старожил


Сообщения: 302
Благодарности: 114

Профиль | Отправить PM | Цитировать


Цитата mihailov_den@vk:
последние 6 цифр меняются, эта нумерация создаются программой, которая делает скрин шоты. »
Скорее всего, это всё же, не просто нумерация, а именно HHmmss (сейчас в скрипте это учтено и дата используется только для формирования целевого каталога), но по сути, это не имеет большого значения...

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

Но тут другое интересует... В том скрипте, который Вы приводили выше, присутствует такая запись:
Цитата mihailov_den@vk:
Файл в папке 1 новее, чем в папке 2. Нужно скопировать" »
Если я правильно понял, то при наличии одноименного файла в целевом каталоге, требуется проверка на "свежесть" файла? Это в моем скрипте не реализовано.
Если это требуется, то можно реализовать, но в этой проверке будут сравниваться только LastWriteTime, ибо проверка на "свежесть" наиболее корректна будет именно по этой дате...

-------
scio me nihil scire

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:52, 21-01-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Доработать скрипт копирования файлов изображений

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Скрипт для копирования файлов/папок с заменой 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




 
Переход