Нахождение дня недели в пакетном файле? (Windows Server 2008)

Задание крона для дампа очень полезно, но на всякий случай Вы не делаете наличие чего-либо готового к на самом деле изображает вещь в виде графика, я могу рекомендовать munin, который имеет плагины MySQL для контроля

  • пропускная способность
  • запросы
  • размер баз данных
  • медленные запросы
  • потоки

который может довольно полезный для определения скачков. Я выполняю через пять минут интервал по умолчанию.

Используя его за прошлый год я обнаружил довольно интересную ситуацию с ним, перед которой передал бы абсолютно незамеченный иначе.

7
задан 15 March 2017 в 14:37
23 ответа

Хорошо, найденный ответом...
Я не мог найти способ использовать простые Bat-файлы, но если у Вас есть доступ к powershell...

@echo off
powershell date > date.txt
find/i "Fri" date.txt  > nul
if errorlevel 1 goto SkipWeeklyTasks

Do your weekly stuff here

:SkipWeeklyTasks
del date.txt

Надежда это помогает...

Править: (для потенциальных людей, натыкающихся на это), Это противно и ужасно, и не должно быть сделано, и другие ответы на этот вопрос лучше, если они относятся к Вам. Если НЕОБХОДИМО было сделать это быстро и грязный в пакетном файле, Вы уже имеете, это могло работать на Вас, все же.

Daniel

-2
ответ дан 2 December 2019 в 23:14
  • 1
    Urgh.Пожалуйста. Если необходимо использовать PowerShell для этого, то, по крайней мере, отдают результат that' s (a) независимый от любых настроек локали [день недели не должен присутствовать и это doesn' t должны быть на английском языке] и (b) легко parseable. Так powershell "&{[int](Get-Date).DayOfWeek}", вероятно, лучший ответ, и можно легко поместить это в переменную среды и сравнить ее. –  Joey 16 December 2009 в 08:50
  • 2
    Если Ваша попытка использовать powershell вообще Вы могли бы также перевести целый сценарий в powershell. –  Zypher 16 December 2009 в 09:11
  • 3
    Zypher, that' s очевидная идея, конечно :-) –  Joey 16 December 2009 в 09:44
  • 4
    Иоганнес: Yah, это - на самом деле проблема, которую я должен решить и избавиться от как можно быстрее. Это только должно работать в МОЕЙ машине (машинах). Каждая дополнительная секунда я трачу создание этого более универсального, чем, мне нужно, по существу потрачен впустую. Zypher: Yah, но у меня уже были свое выполнение пакетного файла и работа и я don' t знают много о PowerShell, я только хотел добавить раздел, который только работал один раз в неделю, и снова, избавьтесь от него как можно быстрее. Но что you' ре оба высказывания ЯВЛЯЮТСЯ определенно хорошим советом в случае, если кто-то читает это решение. –  Daniel Magliola 16 December 2009 в 17:56

Просто другой ответ, который делает точно это при помощи wmic

@echo off
set "d1=Mon" & set "d2=Tue" & set "d3=Wed" & set "d4=Thu" & set "d5=Fri" & set "d6=Sat" & set "d7=Sun"
for /f %%i in ('wmic path win32_localtime get dayofweek ^| findstr /r /c:[1-7]') do call echo %%d%%i%%
0
ответ дан 2 December 2019 в 23:14

Позвольте мне заключить в кавычки что-то, что я нашел в сети:

О проблеме DOW...

Выиграйте 2 000 дисплеев текущая дата путем заголовка со Днем Недели, но Победа XP дает Вам пустую дату в Вашем формате страны без DOW. Это - одно из небольших раздражений, влияющих на два (почти) братья, действующие sysyems.

Работать вокруг приема означает вызвать унаследованный формат, отображенный (эмулированным) DOS

Echo.|Command /C Date|Find "current"

Это действительно работает, теперь просто необходимо теребить DOW из outputstring, и Вы сделаны...

1
ответ дан 2 December 2019 в 23:14
  • 1
    Я на самом деле нашел, что, попробовал его и получил ошибку это " command" doesn' t существуют... Я на самом деле нашел набор решений для XP, которые не работают в Сервере 2008... –  Daniel Magliola 16 December 2009 в 17:57
  • 2
    эхо %DATE: ~ 0,3% –  jscott 16 December 2009 в 19:40
  • 3
    jscott: как я упомянул в вопросе, дата doesn' t возвращают день недели для меня. Только dd/mm/yyyy. –  Daniel Magliola 16 December 2009 в 22:39

Пакет не может сделать этого легко. Требуется большая командная строка fu с командой даты. Существует несколько способов достигнуть того, что Вы после, но больше всего я задаюсь вопросом, почему встроенный Планировщик задач не является опцией? Это позволяет Вам, указывают дни, которые Вы хотите, чтобы это выполнило и во сколько:

alt text

Вы могли также использовать VBScript:

wscript.stdout.writeline weekdayname(weekday(date))

Затем выполнение это:

C:\Documents and Settings\Administrator>cscript /nologo dayofweek.vbs
Wednesday

Можно легко использовать, если/еще логика в VBScript затем имеет код VBScript, выполняют пакетные файлы в зависимости от дня, и наоборот (имейте вызов пакета VBScript).

4
ответ дан 2 December 2019 в 23:14
  • 1
    У меня в основном есть пакетный файл, который делает набор материала (резервные копии), и часть того материала (ОГРОМНЫЕ папки, которые не настолько важны и don' t часто изменяются), я хочу только сделать это один раз в неделю для сохранения часов ежедневного времени. Я CAN разделил пакетный файл на многих и использует планировщик для управления этим, но он делает все намного более сложным для меня, так как вещи, которые я должен сделать еженедельно, происходят после некоторых и также перед некоторыми ежедневными (в частности, я записываю DVD каждый день после того, как резервное копирование сделано, и это должно произойти ПОСЛЕ ТОГО, КАК длительные задачи сделаны (который трудно оценить), –  Daniel Magliola 16 December 2009 в 17:54

Я немного опаздываю этой стороне, но это даст Вам день недели:

win32_localtime пути wmic получают dayofweek

Используйте пакет для цикла для получения вывода, и у Вас есть тестируемое условие в течение дня недели.

Ограбить

10
ответ дан 2 December 2019 в 23:14

Вот пакетный файл, который получит всю информацию о дате и времени в переменные, но это действительно зависит от Вас устанавливающий соответствующий формат даты на Вашей машине. Кроме того, порядку, возможно, понадобилась бы корректировка в зависимости от локального формата даты, я не уверен.

@echo off
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set WD=%%i
set D=%%j
set M=%%k
set Y=%%l
) 

for /F "tokens=1-4 delims=: " %%i in ('time /t') do (
set H=%%i
set Mn=%%j
set AP=%%k
)

if "%AP%"=="PM" set /A H=%H%+12

echo %WD% %D%/%M%/%Y% - %H%:%Mn%

Бит, который Вы хотите, находится в %WD %.

5
ответ дан 2 December 2019 в 23:14

На самом деле флаг для этого (2K8, 2K3, XP и т.д.) является КОРОТКИМ форматом даты.

Под Региональным и опциями Language - нажимают Изменение вкладки On the DATE кнопки Customize КОРОТКИЙ Формат даты к Изменению "M/d/yyyy" формат ОТДАЛЕННОГО СРОКА к "dddd, ММММ dd, yyyy"

Затем День недели обнаруживается - для тестирования этого выполняют это в подсказке DOS: дата/t вывод должна быть похожей на этот "понедельник 31.01.2011"

1
ответ дан 2 December 2019 в 23:14
  • 1
    Предложенное изменение в региональных настройках добьется цели, но it' s не доступный, если Вашей региональной настройкой является Канада..., она работает, как описано, когда регион установлен на США... и я wouldn' t изменяют его на сервере из опасения, что что-то еще будет гадить. –   11 February 2013 в 23:29

Если кому-то это понадобится, это работает для меня в Windows 7 и XP ...

echo.|command /C date|find /i "current" >%temp%\dow.txt
for /f "tokens=1-4 delims=/ " %%i in (%temp%\dow.txt) do set DOW=%%l
echo %DOW%

Для Windows Server 2008 я бы выбрал один из методов Powershell, предложенных выше.

1
ответ дан 2 December 2019 в 23:14

Чтобы избежать перенаправления в текстовый файл, существует вариант FOR, который принимает командную строку. Вот он:

@For / F "tokens = 4 delims = / -"% i In ('@Echo.^|Command / C Date ^ | Find / i "current" ') Do @Echo% i

Не забудьте использовать двойные знаки процента, если вы помещаете эту команду в сценарий dos. В моем примере я проверил наличие общего символа разделителя даты в виде прямой косой черты или тире.

Я предпочитаю это решение, поскольку оно является исключительно DOS без необходимости полагаться на наличие WMI, PowerShell и т. Д.

1
ответ дан 2 December 2019 в 23:14

Как насчет этого для Windows 2008 намного элегантнее. Также будет работать везде, где установлен PowerShell.

@for /F "tokens=1 delims=, " %%i In ('powershell date') do set dow=%%i
echo %dow%
1
ответ дан 2 December 2019 в 23:14
@echo off

:set the variables
for /f %%C in ('wmic path Win32_LocalTime Get Year^,Month^,Day^,Hour^,Minute^,Second /Format:List 2^>nul ^| find "="') do @set current%%C

:display the variables
set current

Теперь остается только добавить нули к дню и месяцу, если любой из них меньше 10.

2
ответ дан 2 December 2019 в 23:14

Благодаря предыдущей публикации Фила Свиса - это работает здорово:

echo. | cmd / C date | найти "текущий"

Примеры использования:

echo. | cmd / C дата | find / i "Fri" && echo сегодня пятница

Или наоборот:

echo. | cmd / C date | найти / я "Пт" || echo сегодня НЕ пятница

1
ответ дан 2 December 2019 в 23:14

Я в США. Я могу запустить этот код в Windows 7, Windows 2008 R2, Windows Server 2003, Windows XP (все ОС имеют текущие обновления и исправления Windows). Все с короткой установкой даты без ddd (или dddd) (день недели).

@echo off
for /f %%a in ('date /t') do set DAY=%%a
echo.
echo The Day Is: %DAY%
echo.

Если сегодня четверг, будет выведено «The Day Is: Thu».

Это возвращает день во всех 4 версиях Windows, которые у меня есть проверено на. И только день. Когда я изменил настройку короткой даты на «ddd, M / d / yyyy», мой вывод будет показывать день с запятой (например, Thu,), что говорит мне, что этот код действительно использует короткий формат даты. Но может также случиться так, что если короткая дата не содержит дня недели,

0
ответ дан 2 December 2019 в 23:14

Я использую ...

for /f %i in ('cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]') do set dayofweek=%i

... для получения номера текущего дня.

-2
ответ дан 2 December 2019 в 23:14

Вот правильный ответ для сценария BAT в современной системе:

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i
echo %dow%

Выводы:

Saturday

Использование:

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i
if %dow% == Saturday goto shutdown
if %dow% == Sunday goto shutdown
exit

:shutdown
shutdown /s /f /t 90

Я использовал это для ПК, которые автоматически загружаются ежедневно из BIOS, что не имеют возможности исключать выходные.

Кроме того: ACPI - более надежный способ сделать это, и позволяет использовать фиктивный сценарий BAT, такой как exit , в запланированной задаче Windows с выбранные дни с помощью параметра Разбудить компьютер для выполнения этой задачи .

3
ответ дан 2 December 2019 в 23:14

Это можно сделать с помощью простого вычисления

 ::get dow number (1=monday) from dd mm yy 
 set/a a=(14-mm)/12,yr=yy-a,m=mm+12*a-2,"dow=(dd+yr+yr/4-yr/100+yr/400+31*m/12)%%7"
1
ответ дан 2 December 2019 в 23:14
for /f "skip=1" %%a in ('WMIC Path win32_LocalTime Get DayOfWeek') do if not defined dayNumber set dayNumber=%%a
-2
ответ дан 2 December 2019 в 23:14
ECHO: I needed a more comprehensive solution using an array.
@ECHO OFF
setlocal EnableDelayedExpansion

ECHO :: Get DayOfWeek
ECHO :: Will return DayOfWeek=#
ECHO :: 
For /F "tokens=1 delims=| " %%a In ( 'wmic path win32_localtime get dayofweek /Value^|Find "DayOfWeek"' ) Do (
  Echo %%a
  set "str=%%a"
  ECHO :: Remove DayOfWeek=
  set "str=!str:~10,1!"
  ECHO !str!
)
ECHO.
ECHO :: Create vector with names of days (Index of Days)
for %%d in (Monday Tuesday Wednesday Thrusday Friday Saturday Sunday) do (
  set /A i=i+1
  set day[!i!]=%%d
  if !i!==!str! (
    ECHO :: If today what DayOfWeek is it?
    ECHO %%d
  )
)
ECHO :: 
ECHO.
ECHO :: This is how we get the value outside the loop
set index=!str!
echo(!day[%index%]! 
ECHO.
PAUSE
0
ответ дан 2 December 2019 в 23:14

Мой ответ основан на ответе Роба, но он просто повторяет будний день, а вопрос заключался в том, как изменить ход сценария в зависимости от дня недели (именно то, что я хотел сделать) . Что ж, это оказалось менее простым, чем кажется, потому что каким-то образом цикл FOR заставляет обрабатывать две строки вместо одной, а вторая (которая кажется пустой) прерывает выполнение скрипта.

Единственный цикл FOR , который действительно работал у меня, не прерывая выполнение, это следующий:

for /F "skip=1" %%I in ('wmic path win32_localtime get dayofweek') do (set /a dow=%%I 2>NUL)
if %dow% geq 6 goto ok
echo You can run this script only on Saturday or Sunday
goto :eof
:ok
REM do more stuff here

Часть 2> NUL подавляет ошибку, которая в противном случае отображалась бы во время второго присваивание, а / a имеет дело с одним пробелом, который добавляется из-за перенаправления.

2
ответ дан 2 December 2019 в 23:14
#USE POWERSHELL:
cls
$Today = (Get-Date).DayOfWeek
$daylabel = $Today | select label,day |
        where dayofweek -eq 'friday' |
        select -ExpandProperty label
# End of week ( Saturday ) in OLE Automation date format.
$TimeStamp = Get-Date -Format o | foreach {$_ -replace ":", "."}
 <#
$TimeStamp
$Today
$daylabel
 #>
#Run all your scripts every day but friday
If ($daylabel -eq 'Friday'){
run script |out-file -filepath "filepath\'$timestamp.filename.txt" -Encoding UTF8
}
ELSE {do something else, like 'ECHO "No scripts will be run today."}

. Если вы хотите, чтобы для запуска было несколько дней, добавьте значения:

If ($daylabel -eq 'Friday','Thursday','Wednesday'){
0
ответ дан 2 December 2019 в 23:14

Решение, опубликованное Атнтони Гуалем, работает с обычным пакетом, но мы должны присвоить некоторые переменные перед выполнением вычислений

Это можно сделать с помощью простых вычислений :: получить номер доу (1 = понедельник) от дд мм гг set / aa = (14-мм) / 12, yr = yy-a, m = mm + 12 * a-2, "dow = (dd + yr + yr / 4-yr / 100 + yr / 400 + 31 * m / 12) %% 7 "

:: extract date from date command on OS with date format dd-mm-yyyy
for /F "tokens=1,2,3 delims=-" %%a in ('echo %date%') do (set dd=%%a & set mm=%%b & set yy=%%c)

::get dow number (1=monday) from dd mm yy 
set/a a=(14-%mm%)/12,yr=%yy%-a,m=%mm%+12*a-2,"dow=(%dd%+yr+yr/4-yr/100+yr/400+31*m/12)%%7"
0
ответ дан 2 December 2019 в 23:14

это решение:

for /f %i in ('cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]') do set dayofweek=%i

Работает при использовании этой команды из CMD но если вы хотите использовать его в BAT-файле, вы должны использовать:

for /f %%i in ( 'cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]' ) do set dayofweek=%%i

потому что по-другому вы увидите: Неверный синтаксис команды.

0
ответ дан 16 July 2020 в 18:01

Та же проблема с сервером W2008R2, который раньше работал соответствующим образом. Вероятно, кто-то изменил настройки региона на Короткую дату. Провел небольшое тестирование с настройками региона для короткой даты, и теперь он снова работает:

Я получаю:

  • при настройке короткой даты, такой как MM/dd/yyyy: 10.02.2021

  • если настроена короткая дата, например M/d/yyyy: ср 10.02.2021

-1
ответ дан 10 February 2021 в 13:36

Теги

Похожие вопросы