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

Hronop 09-02-2012 19:03 1855002

файлы разобрать по каталогам в соответствии с датой и пользователем
 
Привет! Помогите доточить скрипт.
Задача - есть в папочке RAW файлы с именами:

20120209_Operator12_192.168.1.1_163404.log
20120209_User2_192.168.100.25_160823.log

Где первое число - это дата,
после подчеркивания - имя пользователя.
потом после подчеркивания - IP-шник
потом после подчеркивания - время в слитном виде, т.е. 163404 соотвествует 16:34:04

Надо эти файлы разобрать по каталогам в соответствии с датой и пользователем, что бы файл
20120209_Operator12_192.168.1.1_163404.log переместился в ./2012/20/29/Operator1/ и имя преобразовалось в 16.34.04_192.168.1.1.log


Сейчас добился того, что распарсивается дата, и юзер(тупо по позиции и количеству знаков):

@Echo Off

reg add "HKLM\Software\Microsoft\Command Processor" /f /v DisableUNCCheck /t REG_DWORD /d 1

SetLocal EnableDelayedExpansion
:: Обрабатываемая папка
Set Folder=.\RAW
:: папка назначения
Set Out=.

For /R "%Folder%" %%i In (*.log) Do (
Set ti=%%~ni
MD "%Out%\!ti:~0,4!\!ti:~4,2!\!ti:~6,2!\!ti:~9,10!" 2>Nul
Copy "%%i" "%Out%\!ti:~0,4!\!ti:~4,2!\!ti:~6,2!\!ti:~9,10!\!ti:~20,50!.log">Nul
del "%%i"

)

::Pause>Nul

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

Что бы из

.\RAW\20120209_Operator12_192.168.1.1_163404.log
.\RAW\20120209_User2_192.168.100.25_160823.log

Получить
.\2012\02\09\User2\16.08.23_192.168.100.25.log
.\2012\02\09\Operator12\16.34.04_192.168.1.1.log

megaloman 09-02-2012 20:22 1855047

Код:

@Echo Off

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Set From=.\Raw
Set To=.
Set Mask=*_*_*_*.log

If Exist "%From%\%Mask%" FOR /F "usebackq tokens=1,2,3,4,5 delims=_" %%a IN (`Dir "%From%\%Mask%" /B /A:-D`) DO (
  Set Dt=%%a
  Set Tm=%%d
  Set NTo=%To%\!Dt:~0,4!\!Dt:~4,2!\!Dt:~6,2!\%%b
  If Not Exist "!NTo!\*.*" Md "!NTo!"
  Move /Y "%From%\%%a_%%b_%%c_%%d" "!NTo!\!Tm:~0,2!.!Tm:~2,2!.!Tm:~4,2!_%%c!Tm:~6,99!"
)

В имени юзера не должно быть _ иначе решение не годится

Hronop 21-02-2012 20:06 1863803

Cпасибо огромное - работает!
Но единственное НО - только на локальном компьютере. При попытке выполнить на сетевом ресурсе не отрабатывает цикл....
Как победить?


Время: 13:29.

Время: 13:29.
© OSzone.net 2001-