Показать полную графическую версию : копирование всех фалов за определённый (прошедщий) месяц
Каталог C:\1 в нём хранят .csv файлы за весь год, нужно скопировать все файлы только за сентябрь
файлы такого формата: 20180916.csv, 20180917.csv, 20180918.csv и т.д.
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
смотрим только на имя файла? За сентябрь только этого года?
Правильно уточняют выше, точнее описывайте условия. Дату файла берем из имени или из свойств файла?
А так, по описанным условиям:
powershell
Да, дату берём именно из имени файла.
Да, дату берём именно из имени файла. »
и здесь тоже напишу:
от же студент пошел нонче находчивый: раскидал задание по всем форумам и сиди жди себе, где вперед ответят... отличный подход!
:)
дату берём именно из имени файла. »
если файл переименовать, то содержание от этого не изменится, а вот фильтр не пропустит его. В реальных же условиях, как правило, требуется именно содержание...
Самый надежный вариант, это по дате последнего изменения, она сохраняется после переименования или даже копирования файла в другое место.
megaloman
01-10-2018, 12:17
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
Если это не лабораторка, а рабочая проблема, лучше сделать по другому. Пишите письма :)
Правильно уточняют выше, точнее описывайте условия. Дату файла берем из имени или из свойств файла?
А так, по описанным условиям:
powershell »
Этого хватило =) большое вам спасибо, и да, я не студент.... Просто вынужден был столкнуться с такой проблемой.
Не сочтите за наглость) Но как можно реализовать тоже самое, только с множеством каталогов, в которых так же нужно выбрать файлы за предыдущий месяц по названию файла?)
Т.е. вместо одного каталога с файлами будет 100 каталогов типа:
С:\1, С:\2, С:\3 и т.д.
megaloman, Если только файлы прошлого месяца (месяц берём из имени файла) и если только скопировать, то »
Работает, благодарю =)
И такой же вопрос еще, если возможно как то решить?
Теперь вместо одного каталога С:\1, есть много каталогов С:\1, С:\2, С:\3, С:\4 и т.д. из всех них нужно так же скопировать файлы по названию за предыдущий месяц...
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
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 - русское
megaloman, И первый, и второй вариант работают, безумно благодарен) Какой параметр отвечает за вывод того что делает скрипт в консоли, а то не видно из консоли, что он копирует.
megaloman
01-10-2018, 17:56
forza11, >nul в конце строки c Xcopy. Убейте его. Обратите внимание, что если файлы в аутбоксе уже есть, то повторно они скопированы не будут, кроме других и если они изменялись. (/D в Xcopy). Зачем делать дурную работу ...
Руками или другим скриптом папки делать не надо
megaloman, Да, всё показывает теперь =)
Последний вопрос остался) как избавиться от каталога (201809) который создаёт скрипт, т.е. сейчас в конечном итоге получается вот такой путь: R:\СС8B552D6666\201809
П.С. Всё, разобрался сам.
Вопрос решён полностью, огромное спасибо!
Но как можно реализовать тоже самое, только с множеством каталогов, в которых так же нужно выбрать файлы за предыдущий месяц по названию файла?)
Т.е. вместо одного каталога с файлами будет 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
- да, здесь не учитывается год, т.е. если в исходных каталогах хранятся файлы за несколько лет, то код надо будет поправить...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC