Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] %DATE% минус рабочий день. (http://forum.oszone.net/showthread.php?t=259716)

Margon 30-04-2013 16:36 2142364

%DATE% минус рабочий день.
 
Добрый день,

Есть две директории одна( D:\STOPotchet\rar\ ) с архиво, другая (D:\STOPotchet\rar\date с фаилом подтверждений для архива. Необходимо при отсутствии файла подтверждений для соответствуещего архива, запускать скрипт.
Вот что у меня вышло для статических папок, проверка работает. Проблема в том что эту проверку нужно запускать каждый день. в директории D:\STOPotchet\rar\ каждый день создается папка, с названием %DATE:~0,2%%DATE:~3,2%%DATE:~8,2%. А проверку нужно запускать для предыдущего РАБОЧЕГО дня. Может кто идей подкинет?

@echo off
if %1.==. exit
SET FDIR=D:\STOPotchet\rar\

"C:\Program Files\WinRAR\rar.exe" x D:\STOPotchet\*.rar TRAFN*.arj D:\STOPotchet\rar\%DATE:~0,2%%DATE:~3,2%%DATE:~8,2%\


echo --------------------------------------------------------------------------------------------------
: проверим все ли отправили что подготовили
for %%i in (D:\STOPotchet\rar\%DATE:~0,2%%DATE:~3,2%%DATE:~8,2%\*.arj) do call :ch %%~nxi
goto end


:ch
SET FTRAFN=%1
SET FIZV=IZV_%FTRAFN:~6,12%.txt

echo %DATE% %TIME% - %FTRAFN% - ищем %FIZV%

if not exist %FDIR%\%FIZV% (
N:\send_psi.vbs "ALARM"
echo %DATE% %TIME% - %FTRAFN% - ALARM
)

exit /b


goto end
:-------------------------------------------------------------------------------
:end

Margon 30-04-2013 16:39 2142370

Если кто не понял. Тут D:\STOPotchet\izv\ создаются папки вида 010203(дата)
Необходимо что бы тут SET FDIR=D:\STOPotchet\rar\ каким то образом выбиралась папка с датой предыдущего рабочего дня.

Georgio 30-04-2013 23:32 2142589

Есть очень простое решение. Для начала вручную создаём файл Date.log и вписываем в него вчерашнюю дату в нужном формате. Далее:

Код:

@ECHO OFF
FOR /F %%I IN (Date.log) DO (
  IF NOT %%I==%DATE:~0,2%%DATE:~3,2%%DATE:~8,2% (
    SET FDIR=D:\STOPotchet\rar\%%I
) ELSE EXIT
)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::Здесь необходимые операции:::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::Переписывем LOG-файл, заменяя дату на текущую (на следущий день она станет вчерашней)::::
ECHO %DATE:~0,2%%DATE:~3,2%%DATE:~8,2%>Date.log


Margon 06-05-2013 10:11 2145184

Спасибо огромное, это то что мне было нужно! Все заработало.

megaloman 06-05-2013 11:40 2145235

Цитата:

в директории D:\STOPotchet\rar\ каждый день создается папка, с названием %DATE:~0,2%%DATE:~3,2%%DATE:~8,2%. А проверку нужно запускать для предыдущего РАБОЧЕГО дня.
При условии, что сегодня папка уже создана, а надо взять вчерашнюю (точнее - за предыдущий раб день), и в директории D:\STOPotchet\rar\ нет лишних поддиректорий, не связанных с датами, вот решение без каких-либо служебных файлов
Код:

@Echo Off

Set Where=D:\STOPotchet\rar\

FOR /F "usebackq skip=1 delims=" %%D IN (`Dir "%Where%" /B /A:D /O:-D /T:C`) DO Set DirName=%Where%%%D\& GoTo :Continue
:Continue

Echo %DirName%

Как это работает: Команда Dir с применёнными ключами выдаёт список поддиректорий отсортированных по дате создания (вначале самая свежая), For в этом списке пропускает первую поддиректорию ("сегодняшняя") и при исполнении присваивает переменной %DirName% полный путь предыдущей по списку директории ("вчерашней").

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

Dragokas 06-05-2013 17:46 2145437

Вот функция, которая показывает вчерашнюю дату:

Код:

@echo off
::Показать дату, которая была 1 день назад
call :fromnow -1
echo %ddmmyyyy%
pause>nul
goto :eof
 
:FromNow
setLocal
set now=%date%
set /a yyyy=%now:~-4%
set /a mm=1%now:~3,2%-100
set /a dd=1%now:~,2%-100
set /a JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
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 yyyy=I,mm=100+J,dd=100+K
EndLocal& set ddmmyyyy=%dd:~-2%.%mm:~-2%.%yyyy%
exit /b


Margon 08-05-2013 09:56 2146446

Diskretor, Спасибо добрый человек, может пригодится, но для моих целей не подходит. Потому что в понедельник надо проверять папку за пятницу.


Время: 01:06.

Время: 01:06.
© OSzone.net 2001-