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

Anufriev 12-09-2012 14:57 1987376

сканирование папки на наличие файла и его архивация
 
добрый день!

1. есть такая задачка, нужно что бы батник сканировал папку с:\test\
1.1. при обнаружении файла формата SBC000000000_000000000000_0000000000000000_100 или SBC000000000_000000000000_0000000000000000_200 нужно запаковать его в архив arj формата A12345GGMMDDnn.arj
1.2. при обнаружении файла формата SBC000000000_000000000000_0000000000000000_300 или SBC000000000_000000000000_0000000000000000_400 нужно запаковать его в архив arj формата B12345GGMMDDnn.arj

где:
0 переменное число;

2. отработать команду "C:\ARJ32\ARJ32.exe m -e C:\test\#(зависит от пунктов 1.1 и 1.2)12345GGMMDDnn.arj C:\test2\SBC*_*_*_1(зависит от пунктов 1.1 и 1.2)*"

GGMMDD - год, месяц, день;
nn - порядковый номер созданного файла в течение дня (2 символа). Нумерация начинается с 01.

Батник который получился:
Код:

@echo off
setlocal enabledelayedexpansion
:L0001
set GGMMDD=%date:~-2,2%%date:~3,2%%date:~0,2%
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_1* C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*
ping 127.0.0.1>nul
goto L0001
exit /b 0

:SUB0001
for %%F in (%2 %3) do (for /L %%N in (99,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist "%1!NN!.arj" set NewName=%1!NN!.arj
  )
  C:\ARJ32\ARJ32.exe m -e "!NewName!" "%%~dpnxF"
)
exit /b 0


Bob256 12-09-2012 20:32 1987568

Хотя GGMMDD по идее должно звучать YYMMDD...
PHP код:

@echo off
setlocal enabledelayedexpansion
for /"tokens=1,2,3 delims=." %%I in ('date /t') do (
  
set /a GGMMDD="%%K - (%%K / 100) * 100" 
  
set GGMMDD=!GGMMDD!%%J%%I
)
call :SUB0001 C:testA12345 C:test2SBC*_*_*_1C:test2SBC*_*_*_2*
call :SUB0001 C:testB12345 C:test2SBC*_*_*_3C:test2SBC*_*_*_4*
exit /
b 0

:SUB0001
(dir %%3>nil)&&(
  for /
%%N in (99,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    
if not exist %1%GGMMDD%!NN!.arj set NewName=%1%GGMMDD%!NN!.arj
  
)
  
C:ARJ32ARJ32.exe a -%NewName% %%3
)
exit /
b 0 


Anufriev 13-09-2012 06:26 1987729

создает файл с именем nil, архив не создает

с текстом:

Том в устройстве C не имеет метки.
Серийный номер тома: E1AB-11B2

Содержимое папки C:\test


Содержимое папки C:\test

да и если честно, батник какой то странный...

yurfed 13-09-2012 07:14 1987742

Цитата:

Цитата Bob256
call :SUB0001 C:testA12345 C:test2SBC*_*_*_1* C:test2SBC*_*_*_2*
call :SUB0001 C:testB12345 C:test2SBC*_*_*_3* C:test2SBC*_*_*_4* »

Тут всё верно, обратный слеш не забыли?

Цитата:

Цитата Anufriev
да и если честно, батник какой то странный... »

Что именно странно?

Bob256 13-09-2012 09:29 1987786

Цитата:

Цитата Bob256
call :SUB0001 C:\test\A12345 C:\test2\SBC*_*_*_1* C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345 C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*
......
C:\ARJ32\ARJ32.exe a -e %NewName% %2 %3»

teg PHP слеши режет... не думал что всё так запущено...

yurfed 13-09-2012 09:41 1987789

@echo off
Код:

setlocal enabledelayedexpansion
for /f "tokens=1,2,3 delims=." %%I in ('date /t') do (
  set /a GGMMDD="%%K - (%%K / 100) * 100"
  set GGMMDD=!GGMMDD!%%J%%I
)
call :SUB0001 C:\testA12345 C:test2SBC*_*_*_1* C:test2SBC*_*_*_2*
call :SUB0001 C:\testB12345 C:test2SBC*_*_*_3* C:test2SBC*_*_*_4*
exit /b 0

:SUB0001
(dir %2 %3>nil)&&(
  for /L %%N in (99,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist %1%GGMMDD%!NN!.arj set NewName=%1%GGMMDD%!NN!.arj
  )
  C:\ARJ32ARJ32.exe a -e %NewName% %2 %3
)
exit /b 0

Вроде нормально.
Не очень понятно... Это ирония или просто великий и могучий?

Anufriev 13-09-2012 09:44 1987791

все не так запущено;) слеши не помогают;) точнее не в них дело
архиватор пытается найти SBC*_*_*_1*.ARJ:(
получается %NewName% он не видит:(

то что пишет cmd:
Цитата:

Том в устройстве C не имеет метки.
Серийный номер тома: E1AB-11B2

Содержимое папки C:\test2


Содержимое папки C:\test2

12.09.2012 17:22 912 SBC014552362_503820120821_0391001412000075_200.txt
1 файлов 912 байт
0 папок 56*756*834*304 байт свободно
ARJ32 3.08a Copyright (c) 1990-2000 ARJ Software, Inc. Oct 11 2000
Registered to [xxx]

Long filenames enabled

Error (2): No such file or directory

Can't open C:\test2\SBC*_*_*_1*.ARJ
Том в устройстве C не имеет метки.
Серийный номер тома: E1AB-11B2

Содержимое папки C:\test2


Содержимое папки C:\test2

Файл не найден

yurfed 13-09-2012 09:45 1987792

Цитата:

Цитата Bob256
не думал что всё так запущено... »

Это ирония?

Цитата:

Цитата Anufriev
Long filenames enabled »

Может тут собака наделала?
Почему вам обязательно нужен ARJ

Anufriev 13-09-2012 09:51 1987797

потому что это требование организации куда будет отправляться файл, и поспорить с этим нельзя:(

Bob256 13-09-2012 09:52 1987799

Цитата:

Цитата yurfed
Это ирония? »

Это печаль.
Цитата:

Цитата yurfed
C:\ARJ32ARJ32.exe a -e %NewName% %2 %3 »

может
Код:

....
(dir "%2" "%3"|>nil)&&(
....
C:\ARJ32\ARJ32.exe a -e "%NewName%" "%2" "%3"


Anufriev 13-09-2012 09:58 1987802

Цитата:

может Код: .... (dir "%2" "%3"|>nil)&&(
....
C:\ARJ32\ARJ32.exe a -e "%NewName%" "%2" "%3"
еще веселее:)

Цитата:

Непредвиденное появление: ).

Bob256 13-09-2012 10:00 1987803

Цитата:

Цитата Anufriev
Непредвиденное появление: ). »

Код:

(dir "%2" "%3">nil)&&(

Anufriev 13-09-2012 10:02 1987804

в таком случае появляется файл nil с текстом


Том в устройстве C не имеет метки.
Серийный номер тома: E1AB-11B2

Содержимое папки C:\test2


Содержимое папки C:\test2

Bob256 13-09-2012 10:12 1987811

моя вина
Код:

(dir "%2" "%3" >nul)&&(
глаз замылился от разных языков

yurfed 13-09-2012 10:18 1987813


Цитата:

Цитата yurfed
Почему вам обязательно нужен ARJ »

Цитата:

Цитата Anufriev
потому что это требование организации куда будет отправляться файл, и поспорить с этим нельзя »

Это банковские работники :) Сталкивался.

Anufriev 13-09-2012 10:32 1987818

Ты прав:)

Цитата:

Цитата Bob256
Код:
(dir "%2" "%3" >nul)&&(
глаз замылился от разных языков »

да это не страшно, проблемка все равно не в этом;)
архив то он все равно не создает;)

если C:\ARJ32\ARJ32.exe a -e %NewName% %2 %3 изменить на C:\ARJ32\ARJ32.exe a -e NewName %2 %3
то он начнет работать, создаст архив, но естественно не будет имя ему генерировать

а если сделать обходной путь, сначала архивировать, а потом переименовывать этот архив?

Bob256 13-09-2012 11:04 1987830

Код:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3 delims=." %%I in ('date /t') do (set /a GGMMDD="%%K - (%%K / 100) * 100"
  set GGMMDD=!GGMMDD!%%J%%I
)
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_1* C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*
exit /b 0

:SUB0001
(dir %2 %3 >nul)&&(for /L %%N in (9,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist %1!NN!.arj set NewName=%1!NN!.arj
  )
  C:ARJ32ARJ32.exe a -e !NewName! %2 %3
)
exit /b 0


Anufriev 13-09-2012 11:20 1987836

прекрасно, это помогло
только теперь появляется вопросик:
в папке находится несколько файлов формата SBC*_*_*_1*, SBC*_*_*_2* и он их пакует в один архив, а нужно что бы в разные:(
файлы формата SBC*_*_*_3* и SBC*_*_*_4* запаковал в другой архив но тоже пачкой:)

p.s. похоже я косячнул не сказав, что нужно каждый файлик в отдельный архив, в самом начале:(

Bob256 13-09-2012 11:26 1987841

Код:

call :SUB0001 "куда пакуем" "что пакуем"

Anufriev 13-09-2012 11:31 1987846

простите, но я довольно таки дуб в этом и я не знаю куда воткнуть данную строчку:(

Bob256 13-09-2012 12:08 1987868

Если надо SBC*_*_*_1* в A12345GGMMDD(NN) а SBC*_*_*_2* в A12345GGMMDD(NN+1), SBC*_*_*_3* в B12345GGMMDD(NN), SBC*_*_*_4* в A12345GGMMDD(NN+1) то
Код:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3 delims=." %%I in ('date /t') do (set /a GGMMDD="%%K - (%%K / 100) * 100"
  set GGMMDD=!GGMMDD!%%J%%I
)
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_1*
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_4*
exit /b 0

:SUB0001
(dir %2 >nul)&&(for /L %%N in (9,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist %1!NN!.arj set NewName=%1!NN!.arj
  )
  C:ARJ32ARJ32.exe a -e !NewName! %2
)
exit /b 0


Anufriev 13-09-2012 12:20 1987879

нужно что бы SBC*_*_*_1* или SBC*_*_*_2* в A12345GGMMDD(NN), потом SBC*_*_*_1*+1 или SBC*_*_*_2*+1 в A12345GGMMDD(NN+1) и так далее,
нужно что бы SBC*_*_*_3* или SBC*_*_*_4* в B12345GGMMDD(NN), потом SBC*_*_*_3*+1 или SBC*_*_*_4*+1 в B12345GGMMDD(NN+1) и так далее,

но может и оказаться что цифра измениться и тут SBC*_*+1_*_1* и следовательно этот файл должен быть запакован в отдельный архив... то есть, каждый файлик в отдельный архив
значение (NN) должно зависеть от любого изменения имени файла

Bob256 13-09-2012 12:26 1987882

С этого места поподробней. Дай список файлов и желаемое распределение по архивам

Anufriev 13-09-2012 12:39 1987886

SBC014552362_503820120814_0391001412000068_100.txt => A12345GGMMDD(01)
SBC014552362_503820120816_0391001412000071_400.txt => B12345GGMMDD(01)
SBC014552362_503820120821_0391001412000075_200.txt => A12345GGMMDD(02)
SBC014552362_503820120824_0391001412000077_300.txt => B12345GGMMDD(02)
SBC214552362_503820120817_0391001412000072_100.txt => A12345GGMMDD(03)

но файлы постоянно появляются новые с абсолютно разными цифрами в наименовании, и предугадать какой появиться я не могу;) единственное что постоянно это SBC

Bob256 13-09-2012 13:07 1987899

И чем не устраивает последний вариант?

Anufriev 13-09-2012 13:10 1987901

тем что если появилось два файла с окончанием 100 он запакует их в один архив;)

Mushroomhead 13-09-2012 13:11 1987902

Может, разбить эти файлы на 2 массива и упаковку делать уже циклом по элементам массива?

Bob256 13-09-2012 14:39 1987958

Итого имеем:
  • В папке файлы типа SBC*_*_*_* и появляются новые
  • Архивы создаются для каждого файла по шаблону SBC*_*_*_[1,2]*>A12345GGMMDDNN, SBC*_*_*_[3,4]*>B12345GGMMDDNN где GGMMDD текущая дата. (или дата создания файла?)
  • Глядя на имена архивов мы не можем сказать какие файлы уже упакованы
что я упустил?

Anufriev 13-09-2012 14:47 1987966

дата текущая
те файлы которые уже упакованы их там уже нет, то есть удаляются сразу

Bob256 13-09-2012 15:26 1987992

Тогда так:
Код:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3 delims=." %%I in ('date /t') do (set /a GGMMDD="%%K - (%%K / 100) * 100"
  set GGMMDD=!GGMMDD!%%J%%I
)
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_1* C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*
exit /b 0

:SUB0001
for %%F in (%2 %3) do (for /L %%N in (99,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist "%1!NN!.arj" set NewName=%1!NN!.arj
  )
  C:ARJ32ARJ32.exe a -e "!NewName!" "%%~dpnxF"
  del /q "%%~dpnxF"
)
exit /b 0


Anufriev 14-09-2012 06:01 1988384

спасибо огромное!!!

только, что бы не было лишней строчки:
Код:

del /q "%%~dpnxF"
команду arj заменить с a на m

Код:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3 delims=." %%I in ('date /t') do (set /a GGMMDD="%%K - (%%K / 100) * 100"
  set GGMMDD=!GGMMDD!%%J%%I
)
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_1* C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*
exit /b 0

:SUB0001
for %%F in (%2 %3) do (for /L %%N in (99,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist "%1!NN!.arj" set NewName=%1!NN!.arj
  )
  C:\ARJ32\ARJ32.exe m -e "!NewName!" "%%~dpnxF"
)
exit /b 0

и все работает как часики

возник еще один вопросик, как можно теперь зациклить этот бат, куда поставить метку, что бы бат отрабатывался?
ибо где бы я не поставил метку, вот эти файлы перестают обрабатываться:( call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*

yurfed 14-09-2012 08:33 1988422

Цитата:

Цитата Anufriev
как можно теперь зациклить этот бат »

Вы уверены что вам именно это нужно?
Может просто в планировщик заданий?

Anufriev 14-09-2012 11:11 1988491

планировщик заданий нельзя использовать, из за тех же ЦБ стандартов:(

Bob256 14-09-2012 11:17 1988494

Код:

@echo off
setlocal enabledelayedexpansion
:L0001
set GGMMDD=%date:~-2,2%%date:~3,2%%date:~0,2%
call :SUB0001 C:\test\A12345%GGMMDD% C:\test2\SBC*_*_*_1* C:\test2\SBC*_*_*_2*
call :SUB0001 C:\test\B12345%GGMMDD% C:\test2\SBC*_*_*_3* C:\test2\SBC*_*_*_4*
ping 127.0.0.1>nul
goto L0001
exit /b 0

:SUB0001
for %%F in (%2 %3) do (for /L %%N in (99,-1,1) do (if %%N LEQ 9 (set NN=0%%N) else set NN=%%N
    if not exist "%1!NN!.arj" set NewName=%1!NN!.arj
  )
  C:\ARJ32\ARJ32.exe m -e "!NewName!" "%%~dpnxF"
)
exit /b 0


Anufriev 14-09-2012 12:36 1988545

все, батник шикарен, спасибо огромное Bob256


Время: 19:31.

Время: 19:31.
© OSzone.net 2001-