Задание крона для дампа очень полезно, но на всякий случай Вы не делаете наличие чего-либо готового к на самом деле изображает вещь в виде графика, я могу рекомендовать munin, который имеет плагины MySQL для контроля
который может довольно полезный для определения скачков. Я выполняю через пять минут интервал по умолчанию.
Используя его за прошлый год я обнаружил довольно интересную ситуацию с ним, перед которой передал бы абсолютно незамеченный иначе.
Хорошо, найденный ответом...
Я не мог найти способ использовать простые 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
Просто другой ответ, который делает точно это при помощи 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%%
Позвольте мне заключить в кавычки что-то, что я нашел в сети:
О проблеме DOW...
Выиграйте 2 000 дисплеев текущая дата путем заголовка со Днем Недели, но Победа XP дает Вам пустую дату в Вашем формате страны без DOW. Это - одно из небольших раздражений, влияющих на два (почти) братья, действующие sysyems.
Работать вокруг приема означает вызвать унаследованный формат, отображенный (эмулированным) DOS
Echo.|Command /C Date|Find "current"
Это действительно работает, теперь просто необходимо теребить DOW из outputstring, и Вы сделаны...
Пакет не может сделать этого легко. Требуется большая командная строка fu с командой даты. Существует несколько способов достигнуть того, что Вы после, но больше всего я задаюсь вопросом, почему встроенный Планировщик задач не является опцией? Это позволяет Вам, указывают дни, которые Вы хотите, чтобы это выполнило и во сколько:
Вы могли также использовать VBScript:
wscript.stdout.writeline weekdayname(weekday(date))
Затем выполнение это:
C:\Documents and Settings\Administrator>cscript /nologo dayofweek.vbs Wednesday
Можно легко использовать, если/еще логика в VBScript затем имеет код VBScript, выполняют пакетные файлы в зависимости от дня, и наоборот (имейте вызов пакета VBScript).
Вот пакетный файл, который получит всю информацию о дате и времени в переменные, но это действительно зависит от Вас устанавливающий соответствующий формат даты на Вашей машине. Кроме того, порядку, возможно, понадобилась бы корректировка в зависимости от локального формата даты, я не уверен.
@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 %.
На самом деле флаг для этого (2K8, 2K3, XP и т.д.) является КОРОТКИМ форматом даты.
Под Региональным и опциями Language - нажимают Изменение вкладки On the DATE кнопки Customize КОРОТКИЙ Формат даты к Изменению "M/d/yyyy" формат ОТДАЛЕННОГО СРОКА к "dddd, ММММ dd, yyyy"
Затем День недели обнаруживается - для тестирования этого выполняют это в подсказке DOS: дата/t вывод должна быть похожей на этот "понедельник 31.01.2011"
Если кому-то это понадобится, это работает для меня в 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, предложенных выше.
Чтобы избежать перенаправления в текстовый файл, существует вариант FOR, который принимает командную строку. Вот он:
@For / F "tokens = 4 delims = / -"% i In ('@Echo.^|Command / C Date ^ | Find / i "current" ') Do @Echo% i
Не забудьте использовать двойные знаки процента, если вы помещаете эту команду в сценарий dos. В моем примере я проверил наличие общего символа разделителя даты в виде прямой косой черты или тире.
Я предпочитаю это решение, поскольку оно является исключительно DOS без необходимости полагаться на наличие WMI, PowerShell и т. Д.
Как насчет этого для Windows 2008 намного элегантнее. Также будет работать везде, где установлен PowerShell.
@for /F "tokens=1 delims=, " %%i In ('powershell date') do set dow=%%i
echo %dow%
@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.
Благодаря предыдущей публикации Фила Свиса - это работает здорово:
echo. | cmd / C date | найти "текущий"
Примеры использования:
echo. | cmd / C дата | find / i "Fri" && echo сегодня пятница
Или наоборот:
echo. | cmd / C date | найти / я "Пт" || echo сегодня НЕ пятница
Я в США. Я могу запустить этот код в 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,), что говорит мне, что этот код действительно использует короткий формат даты. Но может также случиться так, что если короткая дата не содержит дня недели,
Я использую ...
for /f %i in ('cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]') do set dayofweek=%i
... для получения номера текущего дня.
Вот правильный ответ для сценария 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 с выбранные дни с помощью параметра Разбудить компьютер для выполнения этой задачи .
Это можно сделать с помощью простого вычисления
::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"
for /f "skip=1" %%a in ('WMIC Path win32_LocalTime Get DayOfWeek') do if not defined dayNumber set dayNumber=%%a
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
Мой ответ основан на ответе Роба, но он просто повторяет будний день, а вопрос заключался в том, как изменить ход сценария в зависимости от дня недели (именно то, что я хотел сделать) . Что ж, это оказалось менее простым, чем кажется, потому что каким-то образом цикл 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
имеет дело с одним пробелом, который добавляется из-за перенаправления.
#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'){
Решение, опубликованное Атнтони Гуалем, работает с обычным пакетом, но мы должны присвоить некоторые переменные перед выполнением вычислений
Это можно сделать с помощью простых вычислений :: получить номер доу (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"
это решение:
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
потому что по-другому вы увидите: Неверный синтаксис команды.
Та же проблема с сервером W2008R2, который раньше работал соответствующим образом. Вероятно, кто-то изменил настройки региона на Короткую дату. Провел небольшое тестирование с настройками региона для короткой даты, и теперь он снова работает:
Я получаю:
при настройке короткой даты, такой как MM/dd/yyyy:
10.02.2021
если настроена короткая дата, например M/d/yyyy:
ср 10.02.2021
powershell "&{[int](Get-Date).DayOfWeek}"
, вероятно, лучший ответ, и можно легко поместить это в переменную среды и сравнить ее. – Joey 16 December 2009 в 08:50