Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переменная Дня недели

Ответить
Настройки темы
CMD/BAT - [решено] Переменная Дня недели

Пользователь


Сообщения: 112
Благодарности: 20

Профиль | Отправить PM | Цитировать


Всем доброе время суток!

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

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

Отправлено: 17:27, 10-03-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


решил свести все вместе, 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 --------------------------------------

Последний раз редактировалось amel27, 16-04-2009 в 07:12. Причина: исправлена ошибка с днями недели

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:41, 15-04-2009 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:29, 15-04-2009 | #12


Аватара для ShaddyR

Железных Дел Мастер


Moderator


Сообщения: 24514
Благодарности: 4495

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
[FAQ] Как определить аппаратную конфигурацию компьютера и правильно задать вопрос
-------
В благодарность за помощь нажимаем ссылочку "Полезное сообщение" внизу этого самого сообщения (подробнее). Помните: админ конфеты НЕ ПЬЁТ ;)
-------
Говори, что думаешь и думай, что говоришь! (c) || МОЙ ShaddyR.at.UA/blog - Как поменять термопасту за 100+ баксов


Отправлено: 15:03, 15-04-2009 | #13



Moderator


Сообщения: 53146
Благодарности: 15423

Профиль | Отправить PM | Цитировать


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
  1. один вызов WMIC;
  2. исправление DayOfWeek (чтобы воскресенье было 7-м днем);
  3. удаление последнего символа (непонятного, типа возврат каретки) из переменных;
  4. на WeekInMonth забил (потому что воскресенье по их стандартам считается началом недели).

Последний раз редактировалось Petya V4sechkin, 15-04-2009 в 15:35.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:07, 15-04-2009 | #14


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


Цитата ShaddyR:
ОС 2003R2_SP2_Ru
...
мож, таки не помешали бы эти самые ГоуТы ? »
Я не говорил, что они лишние, я спросил зачем они. На ХР у меня работает нормально, а 2003 не пользуюсь и проверить не могу, возможно там какие то особенности в cmd. Может там значки $ обязательны в метках!?
Petya V4sechkin, красиво!

Отправлено: 15:26, 15-04-2009 | #15



Moderator


Сообщения: 53146
Благодарности: 15423

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:40, 15-04-2009 | #16


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


- Без 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:
Может там значки $ обязательны в метках!? »
мне так удобней отслеживать переменные по тексту батника, aka в AutoIT и PowerShell
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:11, 16-04-2009 | #17


Пользователь


Сообщения: 62
Благодарности: 5

Профиль | Отправить PM | Цитировать


Из под "Администратора" всё отлично работает, а вот из под "Оператора архива" пишет:
Цитата:
Ошибка при регистрации 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, 02-10-2010 в 23:28.


Отправлено: 21:50, 02-10-2010 | #18


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

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

могу еще предложить чистый 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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум

Это сообщение посчитали полезным следующие участники:

Отправлено: 06:52, 03-10-2010 | #19


Пользователь


Сообщения: 62
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:37, 03-10-2010 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переменная Дня недели

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] как сделать доступ к папкам по дням недели? Steven21 Microsoft Windows NT/2000/2003 15 10-12-2009 17:11
Глобальная переменная 11943499 AutoIt 9 23-07-2009 20:58
[решено] Выход из функции, если переменная не задана D_Master AutoIt 2 19-02-2009 15:05
Интерфейс - [решено] Дни недели и месяца на украинском!Как убрать? Voodoo Child Microsoft Windows Vista 3 07-04-2008 11:06
День недели Hard Программирование и базы данных 5 23-09-2002 07:27




 
Переход