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

forza11 01-10-2018 05:27 2833737

копирование всех фалов за определённый (прошедщий) месяц
 
Каталог C:\1 в нём хранят .csv файлы за весь год, нужно скопировать все файлы только за сентябрь
файлы такого формата: 20180916.csv, 20180917.csv, 20180918.csv и т.д.

Iska 01-10-2018 05:46 2833738

forza11, смотрим только на имя файла? За сентябрь только этого года?

YuS_2 01-10-2018 09:00 2833750

Цитата:

Цитата forza11
Каталог C:\1 в нём хранят .csv файлы за весь год, нужно скопировать все файлы только за сентябрь »

Правильно уточняют выше, точнее описывайте условия. Дату файла берем из имени или из свойств файла?
А так, по описанным условиям:
powershell
Код:

$src = 'c:\1'
$dst = 'd:\2'
$flt = '*.csv'
copy (dir $src\* -filt $flt -file|?{$_.lastwritetime.month -eq (get-date).addmonths(-1).month}).fullname $dst


forza11 01-10-2018 11:23 2833761

Цитата:

смотрим только на имя файла? За сентябрь только этого года?
Цитата:

Правильно уточняют выше, точнее описывайте условия. Дату файла берем из имени или из свойств файла?
А так, по описанным условиям:
powershell
Да, дату берём именно из имени файла.

YuS_2 01-10-2018 11:38 2833764

Цитата:

Цитата forza11
Да, дату берём именно из имени файла. »

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


Цитата:

Цитата forza11
дату берём именно из имени файла. »

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

megaloman 01-10-2018 12:17 2833772

forza11, Если только файлы прошлого месяца (месяц берём из имени файла) и если только скопировать, то
Код:

@Echo Off                                                                                                  %
cls

Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Ext=csv"

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "tNow=%%d"
If %tNow:~4,2%==01 (Set /A Month=%tNow:~0,6%-89) Else (Set /A Month=%tNow:~0,6%-1)

Xcopy /D "%BoxIn%\%Month%??.%Ext%" "%BoxOut%\%Month%\"

pause
Exit /B

Если это не лабораторка, а рабочая проблема, лучше сделать по другому. Пишите письма :)

forza11 01-10-2018 13:06 2833785

Цитата:

Цитата YuS_2
Правильно уточняют выше, точнее описывайте условия. Дату файла берем из имени или из свойств файла?
А так, по описанным условиям:
powershell »

Этого хватило =) большое вам спасибо, и да, я не студент.... Просто вынужден был столкнуться с такой проблемой.
Не сочтите за наглость) Но как можно реализовать тоже самое, только с множеством каталогов, в которых так же нужно выбрать файлы за предыдущий месяц по названию файла?)
Т.е. вместо одного каталога с файлами будет 100 каталогов типа:
С:\1, С:\2, С:\3 и т.д.

forza11 01-10-2018 16:27 2833820

megaloman,
Цитата:

Цитата megaloman
Если только файлы прошлого месяца (месяц берём из имени файла) и если только скопировать, то »

Работает, благодарю =)
И такой же вопрос еще, если возможно как то решить?
Теперь вместо одного каталога С:\1, есть много каталогов С:\1, С:\2, С:\3, С:\4 и т.д. из всех них нужно так же скопировать файлы по названию за предыдущий месяц...

forza11 01-10-2018 17:08 2833827

megaloman,
Цитата:

Цитата megaloman
1.то есть это реальные имена: 1,2,3...100? Или надо иметь какой-то список папок?
2.Куда при этом должны копироваться файлы? В какие папки?
3. Вы уверены, что файлы надо именно копировать, а не перемещать?
4. Не лучше ли сделать не простое копирование файлов, а архивацию, например, посредством winrar или 7z »

1 - это не реальные имена, реальные будут по названию мак-адресов типа: С:\СС8B552D6666
2 - файлы должно копироваться в такие же каталоги, только в другое место соответственно, т.е. С:\СС8B552D6666 > R:\СС8B552D6666 (каталоги могу сам создать заранее скриптом)
3 - именно копировать)
4 - архивация не нужна, они уже бэкапятся эти файлы, просто нужно скопировать много файлов из множества каталогов)

megaloman 01-10-2018 17:19 2833830

forza11,
Код:

@Echo Off
cls

Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Ext=csv"

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "tNow=%%d"
If %tNow:~4,2%==01 (Set /A Month=%tNow:~0,6%-89) Else (Set /A Month=%tNow:~0,6%-1)

Call :@ СС8B552D6666
Call :@ СС8A552D8888
Call :@ СС8C552D9999
Call :@ СF8B552D7777

pause
GoTo :Eof

:@
        If Exist "%BoxIn%\%1\%Month%??.%Ext%" Xcopy /D "%BoxIn%\%1\%Month%??.%Ext%" "%BoxOut%\%1\%Month%\" >nul
GoTo :Eof

Пропишите свои пути без \ на конце. Для Вашей постановки инбокс указывать C:
Или так
Код:

@Echo Off
cls

Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set "Ext=csv"

Set Mac=СС8B552D6666 СС8A552D8888 СС8C552D9999 СF8B552D7777

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "tNow=%%d"
If %tNow:~4,2%==01 (Set /A Month=%tNow:~0,6%-89) Else (Set /A Month=%tNow:~0,6%-1)

FOR %%i IN (%Mac%) DO Call :@ %%i

pause
GoTo :Eof

:@
        If Exist "%BoxIn%\%1\%Month%??.%Ext%" Xcopy /D "%BoxIn%\%1\%Month%??.%Ext%" "%BoxOut%\%1\%Month%\" >nul
GoTo :Eof

forza11, Будьте корректны при описании папок. Если это мак-адреса, то там не могут быть кириллические символы, а в Вашем примере C - русское

forza11 01-10-2018 17:54 2833839

megaloman, И первый, и второй вариант работают, безумно благодарен) Какой параметр отвечает за вывод того что делает скрипт в консоли, а то не видно из консоли, что он копирует.

megaloman 01-10-2018 17:56 2833840

forza11, >nul в конце строки c Xcopy. Убейте его. Обратите внимание, что если файлы в аутбоксе уже есть, то повторно они скопированы не будут, кроме других и если они изменялись. (/D в Xcopy). Зачем делать дурную работу ...
Руками или другим скриптом папки делать не надо

forza11 01-10-2018 19:57 2833858

megaloman, Да, всё показывает теперь =)
Последний вопрос остался) как избавиться от каталога (201809) который создаёт скрипт, т.е. сейчас в конечном итоге получается вот такой путь: R:\СС8B552D6666\201809
П.С. Всё, разобрался сам.
Вопрос решён полностью, огромное спасибо!

YuS_2 01-10-2018 22:14 2833890

Цитата:

Цитата forza11
Но как можно реализовать тоже самое, только с множеством каталогов, в которых так же нужно выбрать файлы за предыдущий месяц по названию файла?)
Т.е. вместо одного каталога с файлами будет 100 каталогов типа:
С:\1, С:\2, С:\3 и т.д. »

Для powershell это делается легким движением руки, т.е. созданием массива абсолютных (либо относительных) путей:
Код:

$src = 'С:\1\*','С:\2\*','С:\3\*'
$flt = '*.csv'
...(dir $src -filt $flt -file|...

- и это без рекурсии. А ещё существует возможность и рекурсивного просмотра как отдельного, корневого каталога, так и массива каталогов...
powershell - очень гибкий инструмент в этом плане.

ЗЫ А, да, по имени файла получить отфильтрованные файлы, при условии именно такого формата, тоже несложно:
Код:

$src = 'С:\1\*','С:\2\*','С:\3\*'
$dst = 'd:\2'
$flt = '*.csv'
copy (dir $src -filt $flt -file|?{
    ([datetime]::parseexact($_.basename,'yyyyMMdd',$null)).month -eq (get-date).addmonths(-1).month
}).fullname $dst

- да, здесь не учитывается год, т.е. если в исходных каталогах хранятся файлы за несколько лет, то код надо будет поправить...


Время: 23:39.

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