none
Помогите написать BAT-ник. RRS feed

  • Вопрос

  • Доброе время суток!

    Есть Windows server 2000, необходимо что бы планировщик задач переименовывал имеющийся файл c:\backup.7z в c:\Пн.7z или как то по другому, но обязательно должна быть привязка к дню недели, что бы через неделю эти файлы перетирались на новые. Как это сделать? (я бы хотел что бы это было через BAT файл)

    16 января 2008 г. 9:23

Ответы

  • Хммм ... В 2000-м может и не работать. Но вообще вот так (BTW надо не переименовывать, а перемещать. rename _никак_ не дает переименовывать в существующее имя) :

     

    RenBackup.bat

    @echo off
    for /f "tokens=1,2,3 delims=." %%x in ( "%date%") do (
        Set Day=%%x
        Set Month=%%y
        Set Year=%%z
    )

    Set /a a=(14-%Month%)/12
    Set /a y=%Year%-%a%
    Set /a m=%Month%+12*%a%-2
    Set /a DWeek=(7000+(%Day%+%y%+%y%/4-%y%/100+%y%/400+(31*%m%)/12))%%7

     

    if %DWeek%==0 Set DWeek=Воскресенье

    if %DWeek%==1 Set DWeek=Понедельник
    if %DWeek%==2 Set DWeek=Вторник
    if %DWeek%==3 Set DWeek=Среда
    if %DWeek%==4 Set DWeek=Четверг
    if %DWeek%==5 Set DWeek=Пятница
    if %DWeek%==6 Set DWeek=Суббота

     

    move /y c:\backup.7z c:\%Dweek%.7z

     

     

    BTW Это для русской локали. Если формат даты другой - то сменить первый for.

    16 января 2008 г. 10:03

Все ответы

  • Хммм ... В 2000-м может и не работать. Но вообще вот так (BTW надо не переименовывать, а перемещать. rename _никак_ не дает переименовывать в существующее имя) :

     

    RenBackup.bat

    @echo off
    for /f "tokens=1,2,3 delims=." %%x in ( "%date%") do (
        Set Day=%%x
        Set Month=%%y
        Set Year=%%z
    )

    Set /a a=(14-%Month%)/12
    Set /a y=%Year%-%a%
    Set /a m=%Month%+12*%a%-2
    Set /a DWeek=(7000+(%Day%+%y%+%y%/4-%y%/100+%y%/400+(31*%m%)/12))%%7

     

    if %DWeek%==0 Set DWeek=Воскресенье

    if %DWeek%==1 Set DWeek=Понедельник
    if %DWeek%==2 Set DWeek=Вторник
    if %DWeek%==3 Set DWeek=Среда
    if %DWeek%==4 Set DWeek=Четверг
    if %DWeek%==5 Set DWeek=Пятница
    if %DWeek%==6 Set DWeek=Суббота

     

    move /y c:\backup.7z c:\%Dweek%.7z

     

     

    BTW Это для русской локали. Если формат даты другой - то сменить первый for.

    16 января 2008 г. 10:03
  • Ой! Залез на Богом забытый 2000-й ... Так какие проблемы? В одну строчку пишется :

     

    Образец кода

    @echo off

    for /f "tokens=1" %%x in ("%date%") do move /y c:\backup.7z c:\%%x.7z

     

     

     

    В 2000-м день недели в переменной Date ... В 2003-м нет, вот там я и изголялся.

     

    Для выше приведенного скрипта (для красивости) вторая строчка (для 2000-го) выглядит так :

     

    Образец кода
    for /f "tokens=2,3,4 delims=. " %%x in ( "%date%") do (

     

     

     

    16 января 2008 г. 10:24
  • А что в 2000 %date% имеет поле для дня недели?
    Для текущего дня можно и так, как вариант, если в 2000 есть wmic:

    Образец кода

    @echo off
    for /f %%i in ('wmic path win32_LocalTime get DayOfWeek') do set dow=%%i
    if %dow%==0 set dow=Вс
    if %dow%==1 set dow=Пн
    if %dow%==2 set dow=Вт
    if %dow%==3 set dow=Ср
    if %dow%==4 set dow=Чт
    if %dow%==5 set dow=Пт
    if %dow%==6 set dow=Сб

    move /y c:\backup.7z c:\%dow%.7z


    16 января 2008 г. 12:05
  •  01MDM написано:
    А что в 2000 %date% имеет поле для дня недели?

     

    Да. В формате, именно, 2 буквы, а потом дата.


     01MDM написано:

    Для текущего дня можно и так, как вариант, если в 2000 есть wmic:

    Образец кода

    @echo off
    for /f %%i in ('wmic path win32_LocalTime get DayOfWeek') do set dow=%%i
    if %dow%==0 set dow=Вс
    if %dow%==1 set dow=Пн
    if %dow%==2 set dow=Вт
    if %dow%==3 set dow=Ср
    if %dow%==4 set dow=Чт
    if %dow%==5 set dow=Пт
    if %dow%==6 set dow=Сб

    move /y c:\backup.7z c:\%dow%.7z


     

    WMI - не спортивно, можно, тогда уж и на VBS. А вдруг WMI не запущен (у маньяков)? ;-)

    16 января 2008 г. 12:41
  • Ну на счет спортивности вопрос спорный. "Ваш" код иногда не будет работать, если не допишите проверку на 08-09

    Образец кода

    if %Day:~0,1%==0 set Day=0x%Day%
    if %Month:~0,1%==0 set Month=0x%Month%


     
    16 января 2008 г. 13:01
  •  

    Тогда уж, честнее, делать вот такую проверку (год тоже может быть 2-х цифровой). Т.к. мы вычисляем _текущую_ дату, проверку на 60-й год я не делал:

     

    Образец кода

    if %Day:~0,1%==0 set Day=%Day:~1%
    if %Month:~0,1%==0 set Month=%Month:~1%
    if "%Year:~2%"=="" (
       if %Year:~1%=="" (
           set Year=200%Year%
       ) ELSE (
           set Year=20%Year%
       )
    )

     

     

    Потому как HEX преобразование не совсем честно :-) 0-го дня и 0-го месяца из Date мы не должны получить. Если только летоисчисление не сменят :-)

     

    Окончательный вариант :

     

    Образец кода

    @echo off

    for /f "tokens=1,2,3 delims=." %%x in ( "%date%") do (
        Set Day=%%x
        Set Month=%%y
        Set Year=%%z
    )

     

    if %Day:~0,1%==0 set Day=%Day:~1%
    if %Month:~0,1%==0 set Month=%Month:~1%
    if "%Year:~2%"=="" (
       if %Year:~1%=="" (
           set Year=200%Year%
       ) ELSE (
           set Year=20%Year%
       )
    )

     

    Set /a a=(14-%Month%)/12
    Set /a y=%Year%-%a%
    Set /a m=%Month%+12*%a%-2
    Set /a DWeek=(7000+(%Day%+%y%+%y%/4-%y%/100+%y%/400+(31*%m%)/12))%%7

     

    if %DWeek%==0 Set DWeek=Воскресенье
    if %DWeek%==1 Set DWeek=Понедельник
    if %DWeek%==2 Set DWeek=Вторник
    if %DWeek%==3 Set DWeek=Среда
    if %DWeek%==4 Set DWeek=Четверг
    if %DWeek%==5 Set DWeek=Пятница
    if %DWeek%==6 Set DWeek=Суббота

     

    move /y c:\backup.7z c:\%Dweek%.7z

     

     

    16 января 2008 г. 13:53