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

Daemonstar 21-09-2010 16:05 1500803

скрипт переноса файлов с директории в директорию
 
Добрый день уважаемые! Очень нужна ваша помощь в создании скрипта переноса файлов. Есть сервер на котором формируются файлики в папке 1, нужно файлики за сегодняшний день скопировать в папку с сегодняшней датой а затем заархивирывать эту папку и перенести ее на другой сервер в розшареную папку 2. Прошу помочь, возможно есть уже готовые решения?

Anton04 21-09-2010 17:03 1500872

Daemonstar,

Вам сюда уважаемый ;)

Daemonstar 22-09-2010 22:28 1502072

Прошу прощения что изначально поместил тему не в ту ветку форума, спасибо модератору за перенос.
Появился более конкретный вопрос, как заставить copy переносить только файлы начинающиеся на F именно в верхнем регистре, причем за
F идут только цифры и файл без розширения. F*.* не подходит, потому что переносит f в нижнем регистре, а так же файлы с различным розширением начинающиеся на [Ff].
- маска для файлов типа "F0459840298" F[0-9]{+}$ или как сначало указать файлы для копирования?
- подскажите пожалуйста как примонтировать удаленный ресурс net use с логином и паролем
Зарание благодарен.

amel27 25-09-2010 09:46 1503818

Цитата:

Цитата Daemonstar
как заставить copy переносить только файлы начинающиеся на F именно в верхнем регистре »

Код:

set SDIR=d:\1
set DDIR=d:\2
set $R="^F[0-9][0-9]*$"

for /f "delims=" %%i in (
'dir /b/a-d "%SDIR%\*"^|findstr /rc:%$R%'
) do copy /y "%SDIR%\%%i" "%DDIR%\"

Цитата:

Цитата Daemonstar
как примонтировать удаленный ресурс net use с логином и паролем »

Код:

net use x: \\server\share password

Daemonstar 25-09-2010 15:50 1504020

Клас!!! А ведь работает))) Спасибо тебе amel27!
P.S. я ленив, но я исправлюсь :)

Daemonstar 04-11-2010 15:03 1534646

Добрый день! Чтоб не плодить похожих тем, решил отписать сюда же... :
каждый день в корень директории падает 6 файлов , задача первых 3 перенести в заранее созданную папку с вчерашней датой а остальные 3 в папку с сегодняшней датой. С созданием папок и копированием мне уже помогли, а вот как отделить 3 файла от 6ти... В общем делитесь идеями.

Daemonstar 04-11-2010 19:06 1534815

Лед тронулся господа! Нашел на этом же форуме подобную задачку и переделал под себя, но как всегда не без НО.

Код:

@echo on
Cls

set yyyy=%DATE:~-4%&
set dd=%date:~7,2%
set mm=%date:~4,2%


set SDIR=D:\"TMP"\"1"
set DDIR=D:\"TMP"\"2"

MD %SDIR%\%yyyy%%mm%%dd%
MD %DDIR%\%yyyy%%mm%%dd%

set log=0 
FOR %%i IN ("%SDIR%\F???????") Do Call :CopyN "%%i"
GoTo :Eof
:CopyN
Set /A Log=%Log%+1
If %Log% LEQ 3 Copy %1 "%DDIR%\%yyyy%%mm%%dd%\" >nul
GoTo :Eof

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

Еще хочу дополнить, возможно я изначально пошел по неправильному пути, дел в том что я работаю с вайлами начинающимися на F и далее 7 цифр причем это не просто цыфры а конкретный номер, к примеру за вчера был файл F0000001 за сегодня уже будет F0000002 тоесть порядковый номер постоянно увеличиваеться с каждым файлом на еденицу, возможно с этим можно как нидь сыграть?

amel27 06-11-2010 07:29 1535941

Цитата:

Цитата Daemonstar
первых 3 перенести в заранее созданную папку с вчерашней датой »

Цитата:

Цитата Daemonstar
первых три файла в директорию с названием даты за субботу, тоесть позавчера »

...и как это понимать?

Daemonstar 08-11-2010 10:20 1537441

Виноват, напутал : первых три файла в директорию с названием даты за субботу, тоесть позавчера ,
последнее верно.

amel27 08-11-2010 11:13 1537483

Цитата:

Цитата Daemonstar
а вот как отделить 3 файла от 6ти... »

смотря как вы их отделяете при ручном копировании

Цитата:

Цитата Daemonstar
первых три файла в директорию с названием даты за субботу, тоесть позавчера »

всё равно непонятно - пост за 05.11, т.е. за пятницу, значит "позавчера" было средой, а никак не субботой... и какую тут роль играет день недели?... он используется в имени директории?.. и как насчет выходных?.. они учитываются или пропускаются?.. в общем, работа с датами - дело тонкое, продумайте детально алгоритм того, что будем автоматизировать и изложите сюда, иначе это песня без начала и конца... :)

Daemonstar 08-11-2010 12:10 1537508

каждый день кроме субботы и воскресенья по шедулеру запускается скрипт который копирует файлы по маске на удаленную машину, алгоритм простой.
1 Скрипт создает папку с текущей датой
2 Копирует файлы по маске в директорию с текущей датой.
Все бы ничего, но так как суббота и воскресенье выходные дни, в понедельник в корне появляються файлики и за субботу, всего 6 штук, файлики отличаются только порядковым номером в имени. Задача:
1 создать на удаленной машшине папку с текущей датой
2 создать на удаленной машине папку с датой за субботу
3 разделить 6 файлов по 3 по порядку
4 скопировать первых 3 файла в папку за субботу а 4,5,6 в папку с текущей датой, это дело должно работать в понедельник.

Возможно ли это автоматизировать ?

amel27 08-11-2010 12:55 1537530

Daemonstar, может сделать проще - плясать не от даты запуска скрипта, а от даты создания самих файлов (т.е. когда они появились на диске)?.. в этом случае количество файлов и наличие выходных не будет иметь значения, достаточно будет прочитать дату и скинуть в соответствующую папку... ну и для того, чтобы надежно пропарсить команду "DIR /-C/TC" (имя каталога будет в первой колонке) хорошо бы точно знать шаблон имени файла... например, для: Fddddddd.TXT, где d - любая цифра 0-9:
Код:

dir /-C/TC| findstr /eirc:"F[0-9][0-9][0-9][0-9][0-9][0-9][0-9].TXT"

Daemonstar 08-11-2010 13:24 1537546

Спасибо, но файлы падают в директорию после обработки, и по свойствам они все 6 как бы за понедельник, если бы можно было как то плясать от названия так как после F идет порядковый номер, и с каждым последующим файлом этот номер увеличивается на 1. Файлы без расширения.

Daemonstar 09-11-2010 10:30 1538273

Цитата:

достаточно будет прочитать дату и скинуть в соответствующую папку..
Извените за настырность, а как прочитать дату?

amel27 09-11-2010 11:36 1538331

Цитата:

Цитата Daemonstar
как прочитать дату »

как-то так (только вывод команды копирования на экран):
Код:

@echo off

set SRC=C:\TEST1
set DST=C:\TEST2
set REG="F[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"

for /f "tokens=1-3,5* delims=. " %%a in (
'dir/a-d/-c/tc/o-n "%SRC%\*"^|FindStr /ierc:%REG%'
) do echo xcopy /y "%SRC%\%%e" "%DST%\%%c%%b%%a\"


amel27 09-11-2010 12:03 1538348

Цитата:

Цитата Daemonstar
файлы падают в директорию после обработки, и по свойствам они все 6 как бы за понедельник »

ну значит этот трикс не пройдёт... проблема не в делении файлов по 3, а в расчете даты, отличной от текущей, так как в CMD нет своих средств по работе с датами (в отличие от WSH)... но грамотное использование планировщика позволяет часто обойти эту проблему - к примеру, запускать скрипт все рабочие дни + суббота, но в субботу ничего не копировать, а только создавать пустой каталог, который уже заполнять файлами в понедельник...

при "лобовом" методе дату придется вычислять арифметически, примерно так:
читать дальше »
Код:

@echo off
SetLocal EnableDelayedExpansion

set SRC=C:\TEST1
set DST=C:\TEST2
set REG="F[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"

call:StepWorkDays& set $k=3
for /f "delims=" %%a in ('dir/a-d/b/o-n "%SRC%\*"^|FindStr /iberc:%REG%') do (
  if !$k! equ 0 call:StepWorkDays -1& set $k=3
  if not exist "%DST%\!yyyy!!mm!!dd!\" md "%DST%\!yyyy!!mm!!dd!"
  echo copy/y "%SRC%\%%a" "%DST%\!yyyy!!mm!!dd!\">nul
  rem.del "%SRC%\%%a"
  set/a $k-=1
)
EXIT

:StepWorkDays  [%workdays%]
::-------------------------
 if "%dd%"=="" set "yyyy=%DATE:~-4%"& set "mm=%DATE:~3,2%"& set "dd=%DATE:~,2%"
 SetLocal& set/a "$m=100%mm%%%100,$d=100%dd%%%100,$y=10000%yyyy%%%10000,$i=%~1+0"
 set $z=0& if %$i% gtr 0 (set $z=+1) else if %$i% lss 0 set/a "$z-=1,$i=-($i)"
 set/a JD=$d-32075+1461*($y+4800+($m-14)/12)/4+367*($m-2-($m-14)/12*12)/12-3*(($y+4900+($m-14)/12)/100)/4
:StepWorkDays_LOOP
 set/a DW=%JD%%%7
 if %$z% equ 0 if %DW% gtr 5 (Exit/B 1) Else Exit/B 0
 if %DW% gtr 5 set/a "JD=JD%$z%"& GoTo:StepWorkDays_LOOP
 if %$i% neq 0 set/a "JD=JD%$z%,$i-=1"& GoTo:StepWorkDays_LOOP

 set/a L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 set/a L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 set/a J=J+2-12*L,I=100*(N-49)+I+L
 set/a $m=100+J,$d=100+K,$y=10000+I
 EndLocal& set/a "dw=1+(%JD%)%%7,yyyy=%$y:~-4%"& set "mm=%$m:~-2%"& set "dd=%$d:~-2%"
Exit/B 0



процедура StepWorkDays вычисляет (рабочий) день, отстоящий от текущего на заданное количество (рабочих) дней - вперёд или назад, скрипт настроен на 6-дневную рабочую неделю, для 5-дневки нужно поменять в 2-х местах (выделено цветом) "5" на "4", при запуске без параметров проверяет текущий день (рабочий/выходной), читает/устанавливает переменные окружения DW (день недели), YYYY (год), MM (месяц), DD (день)

P.S. использованы формулы пересчета даты с www.dostips.com

Ecohazard 25-01-2018 13:11 2793714

Ох, не знаю, оживёт ли тема.
Подскажите, пожалуйста, нужен скрипт (хотя и любая простая софтина подойдёт), чтобы переносить все новые файлы с папки А в папку Б с подпапками, генерируемыми по дням (типа mm-dd или yyyy-mm-dd). Т.е. папка А постоянна, а в папке Б каждый день должна создаваться своя подпапка. Ну и требуется, чтобы папка А мониторилась постоянно, т.е. при появлении новых файлов в папке А, они переносились в течении нескольких секунд.
Daemonstar упомянул, что нашёл скрипт с генерацией подпапок по дням, но ссылок не нашёл :(


Время: 23:27.

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