Войти

Показать полную графическую версию : [решено] Переменная Дня недели


Страниц : [1] 2

ratibor79
10-03-2009, 17:27
Всем доброе время суток!

Подскажите, пожалуйста, какую команду нужно написать, чтобы создать папку с именем текущего дня недели?

Заранее благодарен!

Maza Faka
11-03-2009, 07:10
создать папку с именем текущего дня недели »
Попробуй так (http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=347#1)

gora
11-03-2009, 13:50
ratibor79, нашел у себя в "залежах":@echo off

:: format: dd.mm.yyyy

echo %date%
set /a y=%date:~6,4%&set /a m=%date:~3,2%&set /a d=%date:~0,2%
set /a i=(%y%-1901)*365 + (%y%-1901)/4 + %d% + (!(%y% %% 4))*(!((%m%-3)^&16))
echo %i%
set /a i=(%i%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))%%7+1
echo %i%
REM (igor_andreev)

for /f "tokens=%i% delims=/" %%a in ('
echo/Понедельник/Вторник/Среда/Четверг/Пятница/Суббота/Воскресенье') do set "w=%%a"
for /f "tokens=%date:~3,2% delims=/" %%a in ('
ECHO/Января/Февраля/Марта/Апреля/Мая/Июня/Июля/Августа/Сентября/Октября/Ноября/Декабря/') do set "mmm=%%a"

echo %w% %d% %mmm% %y%
pause Что не нужно удалите.

ratibor79
11-03-2009, 16:27
gora, спасибо. Как раз то что доктор прописал.

ratibor79
11-03-2009, 17:18
gora Вот только что сталкнулся с ошибкой

Обратите пожалуйста внимание на 8 или 9 числа любого месяца

C:\TEMP>set /a y=2009 & set /a m=02 & set /a d=09
Неправильное число. Числовые константы должны быть десятичными (17)
шестнадцатеричными (0x11),или восьмеричными (021).

C:\TEMP>set /a i=(2009-1901)*365 + (2009-1901)/4 + + (!(2009 % 4))*(!((2-3)&16))

C:\TEMP>set /a i=(39447+(2-1)*30+2*(!((2-7)&16))-1+((65611044>>(2*2))&3))%7+1

C:\TEMP>for /F "tokens=6 delims=/" %a in (' echo/Понедельник/Вторник/Среда/Четве
рг/Пятница/Суббота/Воскресенье') do set "w=%a"

C:\TEMP>set "w=Суббота"

C:\TEMP>for /F "tokens=02 delims=/" %a in (' ECHO/Января/Февраля/Марта/Апреля/Ма
я/Июня/Июля/Августа/Сентября/Октября/Ноября/Декабря/') do set "mmm=%a"

C:\TEMP>set "mmm=Февраля"

C:\TEMP>echo Суббота Февраля 2009
Суббота Февраля 2009

9 февраля - это был понедельник

gora
11-03-2009, 18:25
только что сталкнулся с ошибкой »Скрипт не мой и досканально его не проверял, но проблема легко решается. Немного подправил:@echo off
:: format: dd.mm.yyyy
:: кодировка кирилица DOS (866)
echo %date%
set /a y=%date:~6,4%&set /a m=1%date:~3,2%-100&set /a d=1%date:~0,2%-100
set /a i=(%y%-1901)*365 + (%y%-1901)/4 + %d% + (!(%y% %% 4))*(!((%m%-3)^&16))
set /a i=(%i%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))%%7+1
:: (igor_andreev)
for /f "tokens=%i% delims=/" %%a in ('
echo/Понедельник/Вторник/Среда/Четверг/Пятница/Суббота/Воскресенье') do set "w=%%a"
for /f "tokens=%m% delims=/" %%a in ('
ECHO/Января/Февраля/Марта/Апреля/Мая/Июня/Июля/Августа/Сентября/Октября/Ноября/Декабря/') do set "mmm=%%a"
echo %w% %d% %mmm% %y%
pause>nul

ratibor79
11-03-2009, 19:23
gora
Вот спасибочки работает

amel27
13-03-2009, 05:07
Можно решить задачку элегантней, но для этого придется предварительно скомпилировать WMIC псевдоним для WMI класса Win32_LocalTime (http://msdn.microsoft.com/en-us/library/aa394171(VS.85,printer).aspx), после этого можно будет легко получать любые параметры текущей даты, включая номер квартала, номер недели в месяце и т.д. MOF-файл (файл в WIN-кодировке):

#pragma namespace("\\\\.\\ROOT\\Cli")

instance of MSFT_CliAlias
{
Connection =
instance of MSFT_CliConnection
{
Locale = "ms_409";
NameSpace = "ROOT\\CIMV2";
Server = ".";
};
Description = "Местное время";
Formats =
{
instance of MSFT_CliFormat
{
Format = "TABLE";
Name = "BRIEF";
Properties =
{
instance of MSFT_CliProperty
{
Derivation = "DayOfWeek";
Description = "День недели";
Name = "DayOfWeek";
},
instance of MSFT_CliProperty
{
Derivation = "Year";
Description = "Год";
Name = "Year";
},
instance of MSFT_CliProperty
{
Derivation = "Month";
Description = "Месяц";
Name = "Month";
},
instance of MSFT_CliProperty
{
Derivation = "Day";
Description = "Число";
Name = "Day";
},
instance of MSFT_CliProperty
{
Derivation = "Hour";
Description = "Часы";
Name = "Hour";
},
instance of MSFT_CliProperty
{
Derivation = "Minute";
Description = "Минуты";
Name = "Minute";
},
instance of MSFT_CliProperty
{
Derivation = "Second";
Description = "Секунды";
Name = "Second";
}};
},
instance of MSFT_CliFormat
{
Format = "VALUE";
Name = "FULL";
Properties =
{
instance of MSFT_CliProperty
{
Derivation = "DayOfWeek";
Description = "День недели";
Name = "DayOfWeek";
},
instance of MSFT_CliProperty
{
Derivation = "WeekInMonth";
Description = "Неделя месяца";
Name = "WeekInMonth";
},
instance of MSFT_CliProperty
{
Derivation = "Year";
Description = "Год";
Name = "Year";
},
instance of MSFT_CliProperty
{
Derivation = "Quarter";
Description = "Квартал";
Name = "Quarter";
},
instance of MSFT_CliProperty
{
Derivation = "Month";
Description = "Месяц";
Name = "Month";
},
instance of MSFT_CliProperty
{
Derivation = "Day";
Description = "Число";
Name = "Day";
},
instance of MSFT_CliProperty
{
Derivation = "Hour";
Description = "Часы";
Name = "Hour";
},
instance of MSFT_CliProperty
{
Derivation = "Minute";
Description = "Минуты";
Name = "Minute";
},
instance of MSFT_CliProperty
{
Derivation = "Second";
Description = "Секунды";
Name = "Second";
},
instance of MSFT_CliProperty
{
Derivation = "MilliSeconds";
Description = "Миллисекунды";
Name = "MilliSeconds";
}};
},
instance of MSFT_CliFormat
{
Format = "Table";
Name = "SYSTEM";
Properties =
{
instance of MSFT_CliProperty
{
Derivation = "__PATH";
Name = "__PATH";
},
instance of MSFT_CliProperty
{
Derivation = "__NAMESPACE";
Name = "__NAMESPACE";
},
instance of MSFT_CliProperty
{
Derivation = "__SERVER";
Name = "__SERVER";
},
instance of MSFT_CliProperty
{
Derivation = "__PROPERTY_COUNT";
Name = "__PROPERTY_COUNT";
},
instance of MSFT_CliProperty
{
Derivation = "__RELPATH";
Name = "__RELPATH";
},
instance of MSFT_CliProperty
{
Derivation = "__DYNASTY";
Name = "__DYNASTY";
},
instance of MSFT_CliProperty
{
Derivation = "__SUPERCLASS";
Name = "__SUPERCLASS";
},
instance of MSFT_CliProperty
{
Derivation = "__GENUS";
Name = "__GENUS";
},
instance of MSFT_CliProperty
{
Derivation = "__CLASS";
Name = "__CLASS";
}};
}};
FriendlyName = "LocalTime";
PWhere = "Where Name='#'";
Target = "Select * From Win32_LocalTime";
};

Процедура компиляции (через MOFComp) одноразовая, но можно реализовать условную компиляцию... Например, если имя MOF-файла совпадает с именем CMD-файла, то для обеспечения корректной работы батника на любом компьютере можно добавить в начало скрипта две строчки:
WMIC LocalTime Get DayOfWeek >Nul
If ErrorLevel 1 MOFComp "%~dpn0.mof"

пример батника, использующего созданный псевдоним (DOS-кодировка):

@Echo Off

For /F "Skip=1" %%i In ('WMIC LocalTime Get DayOfWeek') Do Set DayOfWeek=%%i
For /F "Tokens=%DayOfWeek% Delims=," %%i In ("Понедельник,Вторник,Среда,Четверг,Пятница,Суббота,Воскресенье") Do Set DayOfWeekName=%%i

Echo Сегодня %DayOfWeekName%,
Echo это %DayOfWeek%-й день недели

Petya V4sechkin
13-03-2009, 14:25
но для этого придется предварительно скомпилировать WMIC псевдоним
А зачем компилировать? можно ведь сразу:
WMIC Path Win32_LocalTime Get DayOfWeek

amel27
13-03-2009, 15:37
А зачем компилировать? »
спасибо, не знал, что можно без псевдонимов... проглядел :)

amel27
15-04-2009, 11:41
решил свести все вместе, c поддержкой серверных ОС (ненужное можно удалить):
@Echo Off

For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Day') Do Set $Day=%%i&GoTo Day
:Day
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Month') Do Set $Month=%%i&GoTo Month
:Month
For /F "Tokens=%$Month% Delims=," %%i In ("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь") Do Set $MonthName=%%i
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Year') Do Set $Year=%%i&GoTo Year
:Year
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get DayOfWeek') Do Set /A $DayOfWeek=%%i+1&GoTo DayOfWeek
:DayOfWeek
For /F "Tokens=%$DayOfWeek% Delims=," %%i In ("Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница,Суббота") Do Set $DayOfWeekName=%%i
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get WeekInMonth') Do Set $WeekInMonth=%%i&GoTo WeekInMonth
:WeekInMonth
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Hour') Do Set $Hour=%%i&GoTo Hour
:Hour
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Minute') Do Set $Minute=%%i&GoTo Minute
:Minute
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Second') Do Set $Second=%%i&GoTo Second
:Second


Echo --------------------------------------
Echo День : %$Day%
Echo Месяц : %$MonthName% (%$Month%-й месяц года)
Echo Год : %$Year%
Echo --------------------------------------
Echo День недели : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Неделя месяца: %$WeekInMonth%
Echo --------------------------------------
Echo Часов : %$Hour%
Echo Минут : %$Minute%
Echo Секунд : %$Second%
Echo --------------------------------------

gora
15-04-2009, 13:29
amel27, а в чем смысл GoTo? Без них вроде и так будет переходить на следующую строку. Немного причесал, чтобы не "рябило в глазах". @Echo Off

Call :GetVar Day
Call :GetVar Month
For /F "Tokens=%$Month%" %%i In ("Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь") Do Set $MonthName=%%i
Call :GetVar Year
Call :GetVar DayOfWeek
For /F "Tokens=%$DayOfWeek%" %%i In ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") Do Set $DayOfWeekName=%%i
Call :GetVar WeekInMonth
Call :GetVar Hour
Call :GetVar Minute
Call :GetVar Second

Echo --------------------------------------
Echo День : %$Day%
Echo Месяц : %$MonthName% (%$Month%-й месяц года)
Echo Год : %$Year%
Echo --------------------------------------
Echo День недели : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Неделя месяца: %$WeekInMonth%
Echo --------------------------------------
Echo Часов : %$Hour%
Echo Минут : %$Minute%
Echo Секунд : %$Second%
Echo --------------------------------------
Pause>nul
Exit

:GetVar
For /F "Skip=1" %%i In ('WMIC Path Win32_LocalTime Get %1') Do Set $%1=%%i
GoTo :EOF

ShaddyR
15-04-2009, 15:03
Немного причесал, чтобы не "рябило в глазах" »
хм.. видать, косичку сильно затянул..
ОС 2003R2_SP2_Ru
Скрипт подумал секунд несколько и выдал следующее:
--------------------------------------
День :
Месяц : (-й месяц года)
Год :
--------------------------------------
День недели : (-й день недели)
Неделя месяца:
--------------------------------------
Часов :
Минут :
Секунд :
--------------------------------------
как-то кратко очень.. ;)

в отличие от варианта amel27
--------------------------------------
День : 15
Месяц : Апрель (4-й месяц года)
Год : 2009
--------------------------------------
День недели : Среда (3-й день недели)
Неделя месяца: 3
--------------------------------------
Часов : 14
Минут : 4
Секунд : 29
--------------------------------------
мож, таки не помешали бы эти самые ГоуТы ? ;)

Petya V4sechkin
15-04-2009, 15:07
amel27, gora, я бы сделал так:
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

For /F "Tokens=1* Delims==" %%i In ('WMIC Path Win32_LocalTime Get /Value ^| Find "="') Do (
Set V=%%j
Set $%%i=!V:~0,-1!
)
If "%$DayOfWeek%"=="0" Set $DayOfWeek=7

For /F "Tokens=%$Month%" %%i In ("Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь") Do Set $MonthName=%%i
For /F "Tokens=%$DayOfWeek%" %%i In ("Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье") Do Set $DayOfWeekName=%%i

Echo --------------------------------------
Echo День : %$Day%
Echo Месяц : %$MonthName% (%$Month%-й месяц года)
Echo Год : %$Year%
Echo --------------------------------------
Echo День недели : %$DayOfWeekName% (%$DayOfWeek%-й день недели)
Echo Квартал : %$Quarter%
Echo --------------------------------------
Echo Часов : %$Hour%
Echo Минут : %$Minute%
Echo Секунд : %$Second%
Echo --------------------------------------
Pause>nul
Exit

один вызов WMIC;
исправление DayOfWeek (чтобы воскресенье было 7-м днем);
удаление последнего символа (непонятного, типа возврат каретки) из переменных;
на WeekInMonth забил (потому что воскресенье по их стандартам считается началом недели).

gora
15-04-2009, 15:26
ОС 2003R2_SP2_Ru
...
мож, таки не помешали бы эти самые ГоуТы ? »
Я не говорил, что они лишние, я спросил зачем они. На ХР у меня работает нормально, а 2003 не пользуюсь и проверить не могу, возможно там какие то особенности в cmd. Может там значки $ обязательны в метках!? :dont-know
Petya V4sechkin, красиво! :) :up

Petya V4sechkin
15-04-2009, 15:40
2003 не пользуюсь и проверить не могу, возможно там какие то особенности в cmd.
Там WMIC выводит пустую строку в конце.
Бороться можно разными способами: либо вариант amel27 (присвоить значение и сразу выход из цикла через GoTo), либо опцией /Value (чтобы выводилось в формате свойство=значение), а также каналом через Find (чтобы исключить пустые строки вообще).

amel27
16-04-2009, 06:11
- Без Value можно за раз несколько значений (порядок переменных WMIC ставит свой);
- имя выходной переменной может быть произвольным;
- можно обойтись и без GoTo:
@Echo Off

For /F "Tokens=1,2 Skip=1" %%i In ('WMIC Path Win32_LocalTime Get Month^,Year') Do If Not "%%j"=="" Set $Month=%%i&Set $Year=%%j
For /F "Tokens=%$Month% Delims=," %%i In ("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь") Do Set $MonthName=%%i

Set /A $Season = ($Month-$Month/12*12)/3+1
Set /A $MonthInSeason = $Month-$Month/12*12-(%$Season%-1)*3+1
For /F "Tokens=%$Season% Delims=," %%i In ("Зимы,Весны,Лета,Осени") Do Set $SeasonGenitive=%%i

Echo На дворе %$MonthName% - %$MonthInSeason%-й месяц %$SeasonGenitive%


Petya V4sechkin, для бэкапов неважно что считать началом недели, главное период соблюсти

Может там значки $ обязательны в метках!? »
мне так удобней отслеживать переменные по тексту батника, aka в AutoIT и PowerShell

decadent
02-10-2010, 21:50
Из под "Администратора" всё отлично работает, а вот из под "Оператора архива" пишет:
Ошибка при регистрации mof-файлов.
Использовать WMIC.EXE могут только администраторы.
Причина:Ошибка Win32: Отказано в доступе.
Подскажите наиболее изящный выход из положения?

Попробовал другой скрипт (подсмотренный на ixbt):
@echo off
echo.>"%TEMP%\~.ddf"
makecab /D RptFileName="%TEMP%\~.rpt" /D InfFileName="%TEMP%\~.inf" -f "%TEMP%\~.ddf">nul
for /f "tokens=3" %%a in ('type "%TEMP%\~.rpt"') do if not defined weekday set "weekday=%%a"
echo %weekday%
del /q "%TEMP%\~.*"
pause

igor_andreev (c)
Когда вхожу локально от имени оператора архива и запускаю - работает.
А когда запускаю через планировщик .cmd файл от того же пользователя - не работает.

amel27
03-10-2010, 06:52
Из под "Администратора" всё отлично работает, а вот из под "Оператора архива" пишет »права админа требуются только один раз - при первом запуске WMIC... это можно сделать политикой, однократно перед клонированием образа ОС и т.п.

Когда вхожу локально от имени оператора архива и запускаю - работает.
А когда запускаю через планировщик .cmd файл от того же пользователя - не работает. »в таком виде он и не будет работать, т.к. ничего не делает кроме вывода сообщения на консоль, планировщик же выполняет скрипты в скрытом окне

могу еще предложить чистый CMD метод, с использованием ф-ции :DateToWeek (http://www.commandline.co.uk/lib/Batch%20Function%20Library/Date%20and%20Time%20Functions/DateToWeek.html)@echo off

set yy=2010
set mm=10
set dd=3

call :DateToWeek %yy% %mm% %dd% yn cw dw
for /f "tokens=%dw%" %%i in ("понедельник вторник среда четверг пятница суббота воскресенье") Do Set DayOfWeek=%%i
echo %DayOfWeek%& pause>nul
exit /b

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToWeek %yy% %mm% %dd% yn cw dw
::
:: By: Ritchie Lawrence, Updated 2002-11-20. Version 1.1
::
:: Func: Returns an ISO 8601 Week date from a calendar date.
:: For NT4/2000/XP/2003.
::
:: Args: %1 year component to be converted, 2 or 4 digits (by val)
:: %2 month component to be converted, leading zero ok (by val)
:: %3 day of month to be converted, leading zero ok (by val)
:: %4 var to receive year, 4 digits (by ref)
:: %5 var to receive calendar week, 2 digits, 01 to 53 (by ref)
:: %6 var to receive day of week, 1 digit, 1 to 7 (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

decadent
03-10-2010, 10:37
Похоже, что проблема была в другом.
Я изначально пошел по неверному пути, когда у меня возникла проблема с запуском задания из планировщика от имени пользователя, входящего в группу "Операторы архива". Проблема была в том, что когда я входил локально от имени этого пользователя и запускал .cmd файл всё нормально работало, а при запуске того же файла через планировщик, ругалось на отсутствие прав.
Воспользовался неправильным советом http://forum.ixbt.com/topic.cgi?id=7:35541#11 и скопировал файл cmd.exe в папку с батниками и запускал оттуда, а надо было всего лишь права на запуск для cmd.exe прописать...

Вот скрипт, который всё-таки заработал от Оператора архива:
@echo off
echo %date%
set /a y=%date:~6,4%&set /a m=1%date:~3,2%-100&set /a d=1%date:~0,2%-100
set /a i=(%y%-1901)*365 + (%y%-1901)/4 + %d% + (!(%y% %% 4))*(!((%m%-3)^&16))
set /a i=(%i%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))%%7+1
for /f "tokens=%i% delims=/" %%a in ('
echo/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday/Sunday') do set "w=%%a"
for /f "tokens=%m% delims=/" %%a in ('
ECHO/January/February/March/April/May/June/July/August/September/October/November/December') do set "mmm=%%a"

C:\WINDOWS\system32\ntbackup.exe backup \\Fileserver\test /v:yes /m normal /j "FULL backup test - every %w%..." /l:s /f "\\Server\backup$\test-%w%.bkf"
"C:\Program Files\7-Zip\7z.exe" a \\Server\Backup$\test-%w%.7z -test -mhe -ssw \\Server\backup$\test-%w%.bkf
del \\Server\backup$\test-%w%.bkf

P.S: а последний способ через :DateToWeek предложенный amel27 что-то работать не захотел, ну да и ладно...




© OSzone.net 2001-2012