CMD/BAT - [решено] Переменная Дня недели

Аватара пользователя
Petya V4sechkin

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение Petya V4sechkin »

Цитата amel27:



но для этого придется предварительно скомпилировать WMIC псевдоним



А зачем компилировать? можно ведь сразу:



Код:

Код: Выделить всё

WMIC Path Win32_LocalTime Get DayOfWeek
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение amel27 »

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
Аватара пользователя
gora

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение gora »

Цитата gora:



Немного причесал, чтобы не "рябило в глазах"
CMD/BAT - [решено] Переменная Дня недели




хм.. видать, косичку сильно затянул..

ОС 2003R2_SP2_Ru

Скрипт подумал секунд несколько и выдал следующее:


Цитата:



--------------------------------------

День :

Месяц : (-й месяц года)

Год :

--------------------------------------

День недели : (-й день недели)

Неделя месяца:

--------------------------------------

Часов :

Минут :

Секунд :

--------------------------------------



как-то кратко очень.. Изображение



в отличие от варианта amel27


Цитата:



--------------------------------------

День : 15

Месяц : Апрель (4-й месяц года)

Год : 2009

--------------------------------------

День недели : Среда (3-й день недели)

Неделя месяца: 3

--------------------------------------

Часов : 14

Минут : 4

Секунд : 29

--------------------------------------



мож, таки не помешали бы эти самые ГоуТы ? Изображение
Аватара пользователя
ShaddyR

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение ShaddyR »

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 забил (потому что воскресенье по их стандартам считается началом недели).
Аватара пользователя
Petya V4sechkin

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение Petya V4sechkin »

Цитата ShaddyR:



ОС 2003R2_SP2_Ru

...

мож, таки не помешали бы эти самые ГоуТы ?
CMD/BAT - [решено] Переменная Дня недели




Я не говорил, что они лишние, я спросил зачем они. На ХР у меня работает нормально, а 2003 не пользуюсь и проверить не могу, возможно там какие то особенности в cmd. Может там значки $ обязательны в метках!? Изображение

Petya V4sechkin, красиво! Изображение Изображение
Аватара пользователя
gora

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение gora »

Цитата gora:



2003 не пользуюсь и проверить не могу, возможно там какие то особенности в cmd.



Там WMIC выводит пустую строку в конце.

Бороться можно разными способами: либо вариант amel27 (присвоить значение и сразу выход из цикла через GoTo), либо опцией /Value (чтобы выводилось в формате свойство=значение), а также каналом через Find (чтобы исключить пустые строки вообще).
Аватара пользователя
Petya V4sechkin

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение Petya V4sechkin »

- Без 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, для бэкапов неважно что считать началом недели, главное период соблюсти




Цитата gora:



Может там значки $ обязательны в метках!?
CMD/BAT - [решено] Переменная Дня недели




мне так удобней отслеживать переменные по тексту батника, aka в AutoIT и PowerShell
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение amel27 »

Из под "Администратора" всё отлично работает, а вот из под "Оператора архива" пишет:


Цитата:



Ошибка при регистрации 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 файл от того же пользователя - не работает.
Аватара пользователя
decadent

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение decadent »

Цитата decadent:



Из под "Администратора" всё отлично работает, а вот из под "Оператора архива" пишет
CMD/BAT - [решено] Переменная Дня недели




права админа требуются только один раз - при первом запуске WMIC... это можно сделать политикой, однократно перед клонированием образа ОС и т.п.




Цитата decadent:



Когда вхожу локально от имени оператора архива и запускаю - работает.

А когда запускаю через планировщик .cmd файл от того же пользователя - не работает.
CMD/BAT - [решено] Переменная Дня недели




в таком виде он и не будет работать, т.к. ничего не делает кроме вывода сообщения на консоль, планировщик же выполняет скрипты в скрытом окне



могу еще предложить чистый CMD метод, с использованием ф-ции
:DateToWeek

читать дальше »




Код:

Код: Выделить всё

@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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Переменная Дня недели

Сообщение amel27 »

Похоже, что проблема была в другом.

Я изначально пошел по неверному пути, когда у меня возникла проблема с запуском задания из планировщика от имени пользователя, входящего в группу "Операторы архива". Проблема была в том, что когда я входил локально от имени этого пользователя и запускал .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 что-то работать не захотел, ну да и ладно...
Ответить

Вернуться в «Скриптовые языки администрирования Windows»