PowerShell - Копирование файлов по дате

Аватара пользователя
nse

PowerShell - Копирование файлов по дате

Сообщение nse »

Уважаемые форумчане! подскажите пожалуйста, есть ли возможность через power shell сделать следующее

Есть папка1 с множеством файлов *.7z (ежедневные бэкапы)

Как скопировать файлы первого числа каждого месяца в папку2

Условием отбора должна служить дата ИЗМЕНЕНИЯ файлов
Аватара пользователя
Iska

Re: PowerShell - Копирование файлов по дате

Сообщение Iska »

nse, в принципе, можно, но удобнее такие вещи делать а) на WSH/PowerShell, б) не «сейчас», а в момент создания самого архива.
Аватара пользователя
megaloman

Re: PowerShell - Копирование файлов по дате

Сообщение megaloman »

В принципе можно и CMD


Решаю задачу: Если за день создаётся несколько файлов бэкапов с разными именами, копирую все файлы, самые старые по дате изменения в каждом месяце. Если самая старая дата изменения файлов в месяце не 01, а например, 05, будут скопированы файлы за 05 число

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
	Set "BoxIn=D:\CMD_Forum"
	Set "MaskIn=*.7z"
	Set "BoxOut=Z:\Box_Out" 
	Pushd "%BoxIn%"
	Set "FMes= "
	Set "FDay= "
	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%MaskIn%" /B /A:-D /O:D /T:W`) DO Call :CopyFirst "%%f" %%~tf  
	Popd
GoTo :Eof
:CopyFirst
	Set "Mes=%2"
	Set "Mes=%Mes:~-7%"
	If Not "%Fmes%"=="%Mes%" (
		Set "FDay=%2"
		Set "FMes=%Mes%"
	)
	If "%FDay%"=="%2" If Not Exist "%BoxOut%\%~1" Echo %1 &Copy %1 "%BoxOut%\" >nul
GoTo :Eof

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

Код:

Код: Выделить всё

rem	Copy %1 "%BoxOut%\" >nul
	If Not Exist "%BoxOut%\%~1" Echo %1 &Copy %1 "%BoxOut%\" >nul

Примечание: отображение месяца и года в системе должны быть мм гггг
Аватара пользователя
Iska

Re: PowerShell - Копирование файлов по дате

Сообщение Iska »

Цитата nse:



Условием отбора должна служить дата ИЗМЕНЕНИЯ файлов
PowerShell - Копирование файлов по дате




Это можно. Вопрос только в том, какие именно файлы отбирать? Вчерашние, за месяц, за год, до какого числа и т.д. ...

Скопировать, думаю проблем не составит... загвоздка в отборе?

Например, отбор файлов с датой изменения не позднее, чем год назад от текущей даты:



Код:

Код: Выделить всё

$src = 'папка1'
$dst = 'папка2'
if (!(test-path $src) -or !(test-path $dst)){
	write-host 'Проверьте существование каталогов'
	sleep 5
	exit
}
dir "$src\*" -incl '*.7z' -file|?{$_.lastwritetime -lt (get-date).addyears('-1')}
Аватара пользователя
YuS_2

Re: PowerShell - Копирование файлов по дате

Сообщение YuS_2 »

Код:

Код: Выделить всё

$src = 'c:\backup'
$dst = 'c:\archive'
Get-ChildItem $src -File -Recurse | Where-Object {$_.LastWriteTime.Day -eq 1  } | Copy-Item -Destination $dst -WhatIf

YuS_2, не стоит так "обрабатывать ошибки"

во-первых они стали менее информативны;

во вторых для вывода ошибок предназначен поток ошибок;

в третьих, если этот фрагмент начать использовать в групповых операциях, то при ошибке (переименовании, падении сети) этот sleep 5 внезапно растянется на часы
Аватара пользователя
Busla

Re: PowerShell - Копирование файлов по дате

Сообщение Busla »

Цитата Busla:



не стоит так "обрабатывать ошибки"
PowerShell - Копирование файлов по дате




возможно...


Цитата Busla:



во-первых они стали менее информативны;
PowerShell - Копирование файлов по дате




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


Цитата Busla:



если этот фрагмент начать использовать в групповых операциях
PowerShell - Копирование файлов по дате




из пушек по воробьям можно пострелять и из рогатки от ракет тоже можно попытаться отстреливаться... будет задача для групповой операции, будет и другое решение. А для проверки наличия пары каталогов, этого вполне хватит.




Цитата Busla:



$_.LastWriteTime.Day -eq 1
PowerShell - Копирование файлов по дате




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


Цитата nse:



папка1 с множеством файлов *.7z
PowerShell - Копирование файлов по дате
Аватара пользователя
YuS_2

Re: PowerShell - Копирование файлов по дате

Сообщение YuS_2 »

Цитата YuS_2:



Откуда появилась уверенность, что файлы надо копировать только те, которые были изменены первого числа любого месяца и любого года? В условии этого нет.
PowerShell - Копирование файлов по дате




Как это нет?! Есть:


Цитата nse:



первого числа каждого месяца
PowerShell - Копирование файлов по дате
Аватара пользователя
Iska

Re: PowerShell - Копирование файлов по дате

Сообщение Iska »

В принципе можно и CMD


Решаю задачу: Копирую файл самый старый по дате изменения в каждом месяце. Если самая старая дата изменения файла в месяце не 01, а например, 05, будет скопирован файл за 05 число

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
	Set "BoxIn=D:\CMD_Forum"
	Set "MaskIn=*.7z"
	Set "BoxOut=Z:\Box_Out" 
	Pushd "%BoxIn%"
	Set "First= "
	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%MaskIn%" /B /A:-D /O:D /T:W`) DO Call :CopyFirst "%%f" %%~tf  
	Popd
GoTo :Eof
:CopyFirst
	Set "Tekd=%2"
	Set "Tekd=%Tekd:~-7%"
	If "%First%"=="%Tekd%" GoTo :Eof
	Set "First=%Tekd%"
	Copy %1 "%BoxOut%\" >nul
GoTo :Eof

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

Код:

Код: Выделить всё

rem	Copy %1 "%BoxOut%\" >nul
	If Not Exist "%BoxOut%\%~1" Echo %1 &Copy %1 "%BoxOut%\" >nul

Примечание: отображение месяца и года в системе должны быть мм гггг
Аватара пользователя
megaloman

Re: PowerShell - Копирование файлов по дате

Сообщение megaloman »

Цитата Iska:



Как это нет?! Есть
PowerShell - Копирование файлов по дате




А вот так вот, нет:


Цитата nse:



Как скопировать файлы первого числа каждого месяца в папку2
PowerShell - Копирование файлов по дате




а не: скопировать файлы изменённые первого числа.

такшта... Изображение

И запятых, тоже нет... увы...
Аватара пользователя
YuS_2

Re: PowerShell - Копирование файлов по дате

Сообщение YuS_2 »

YuS_2, ну, я понял процитированное Вами именно как:


Цитата YuS_2:



а не: скопировать файлы изменённые первого числа.
PowerShell - Копирование файлов по дате
Ответить

Вернуться в «Скриптовые языки администрирования Windows»