Компьютерный форум 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=335406)

nse 20-06-2018 02:04 2818777

Копирование файлов по дате
 
Уважаемые форумчане! подскажите пожалуйста, есть ли возможность через power shell сделать следующее
Есть папка1 с множеством файлов *.7z (ежедневные бэкапы)
Как скопировать файлы первого числа каждого месяца в папку2
Условием отбора должна служить дата ИЗМЕНЕНИЯ файлов

Iska 20-06-2018 03:01 2818780

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

nse 20-06-2018 08:39 2818792

Iska,
Хорошо, перенес вопрос в раздел PowerShell
тогда помогите пожалуйста это сделать на PowerSell
На счет не "сейчас" это я согласен, но в моей ситуации нужно сделать сейчас, а в последствии модернизировать под момент создания архива

YuS_2 20-06-2018 09:33 2818798

Цитата:

Цитата nse
Условием отбора должна служить дата ИЗМЕНЕНИЯ файлов »

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

$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')}


Busla 20-06-2018 10:34 2818809

Код:

$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 внезапно растянется на часы

YuS_2 20-06-2018 11:43 2818824

Цитата:

Цитата Busla
не стоит так "обрабатывать ошибки" »

возможно...
Цитата:

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

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

Цитата Busla
если этот фрагмент начать использовать в групповых операциях »

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


Цитата:

Цитата Busla
$_.LastWriteTime.Day -eq 1 »

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

Цитата nse
папка1 с множеством файлов *.7z »


Iska 20-06-2018 12:04 2818827

Цитата:

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

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

Цитата nse
первого числа каждого месяца »


megaloman 20-06-2018 15:58 2818864

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

@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

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

YuS_2 20-06-2018 19:24 2818881

Цитата:

Цитата Iska
Как это нет?! Есть »

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

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

а не: скопировать файлы изменённые первого числа.
такшта... ;)
И запятых, тоже нет... увы...

Iska 20-06-2018 19:54 2818883

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

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


megaloman 20-06-2018 21:32 2818894

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

@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

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


Время: 23:55.

Время: 23:55.
© OSzone.net 2001-