делать только если дневной пакетный файл

привет, у меня есть пакетный файл, что-то вроде этого:

if %day%==monday, tuesday, wednesday, thursday, friday (
goto yes
) else (
goto no
)

Теперь я знаю, что первая строка не сработает.

Что я на самом деле хочу, чтобы произошло:

Он автоматически проверяет, какой сегодня день. Если это период с понедельника по пятницу, следует указать «да», в противном случае (суббота/воскресенье) — «нет».

Как это сделать?


person Deniz Zoeteman    schedule 01.06.2009    source источник


Ответы (7)


Я наткнулся на это в Интернете. Проверено, и это работает. Возвращает день как целое число, с которым вы все еще можете работать.

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%
person Michael Petrotta    schedule 01.06.2009
comment
Обратите внимание, что это не будет работать в локалях, где разделитель даты не / - person laalto; 01.06.2009
comment
Это не будет надежным решением, так как когда я использую здесь «дата / t», все, что я получаю, это короткое (ГГГГ-ММ-ДД), поэтому нет имени дня. Идет с локалями. Если это для экспорта (кто-нибудь, кроме вас), я бы не стал делать ставку на то, что это работает так, как задумано. - person Jay; 28.08.2009

Вот пример файла bat, который будет делать такие вещи, я уверен, что вы можете придумать другие способы использования этого примера кода. Например, в любое время, когда вам нужен список «в». Хитрый бит - это %date:~0,3%, это говорит о том, что нужно расширить переменную окружения %date% и, начиная с позиции 0, начало строки вернуть следующие 3 символа. Подробнее об этом можно узнать из "set/?" команда.

пример: IsWeekDay.bat

@echo off
setlocal

for %%i in (Mon,Tue,Wed,Thu,Fri) do (
    if "%date:~0,3%"=="%%i" goto YES
)

:NO
echo No
goto EOF

:YES
echo Yes

:EOF
endlocal
person Jeremy E    schedule 04.06.2009
comment
+1 Отлично. У меня работает на Window7. @YourComputerHelpZ можете указать %date% из командной строки, а также указать дату /t. Можете ли вы рассказать нам, что вы получаете. - person Preet Sangha; 29.08.2009

Как упомянул Джей, использование date /t будет работать только в локалях где эта команда выводит день недели вместе с датой и не будет работать на других локалях (например, на русском). Если вы не возражаете против смешивания ваших пакетных файлов с некоторыми VBScript, вот решение, которое должно работать на всех локалях.

Хитрость заключается в этом крошечном скрипте VBScript, который выводит день недели в виде числа (1 = воскресенье, 2 = понедельник, ... 7 = суббота):

WScript.Echo DatePart("w", Date)

Вы можете запустить этот скрипт из своего пакетного файла, прочитать его вывод и применить свою логику:

for /f %%d in ('cscript dayofweek.vbs //nologo') do (
  if %%d==7 goto no   :: Saturday
  if %%d==1 goto no   :: Sunday
)
goto yes
person Helen    schedule 29.08.2009

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

person Michael Petrotta    schedule 01.06.2009
comment
Я понимаю вас, но тогда я также должен указать конкретное время. BATCH-файл просто запускается при запуске. - person Deniz Zoeteman; 01.06.2009
comment
Вы можете установить триггер в планировщике заданий для выполнения при запуске или при входе в систему. Не обязательно иметь определенное время. - person Mark Berry; 31.07.2017

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

Единственная специфичная для локали вещь - это написание дня недели, остальное не зависит от локали.

Таким образом, на английском языке будет возвращено Thu для четверга, но на голландском языке это будет do (для дондердага).

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: 20110303 - adapted by [email protected] for day-of-week
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: Also, in Dutch, there is a difference between %date% and date/t: the former will not include
:: the day-of-the-week, but the latter will.
:: That means the if "%date%A" LSS "A" trick does not work with %date%, we need a loop
:: to check if the day-of-the-week needs us to take tokens 2-4 in stead of 1-3:
::      if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::      for /f "tokens=1" %%t in ('date/t') do (...)
::
:: Another difference between Dutch and English is that the Dutch date/t will prepend the day of the week in a lower case 2-letter form.
:: So the LSS "A" trick needs to be replaced with an LSS "a" trick
::      if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::        if "%%ta" LSS "a" (set toks=1-3) else (set toks=2-4)
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day_of_week=
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
      for /f "tokens=1" %%t in ('date/t') do (
        set v_day_of_week=%%t
        if "%%ta" LSS "a" (set toks=1-3) else (set toks=2-4)
      )
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET day_of_week=%v_day_of_week% & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%
    echo day of week=%day_of_week%

    :EOF

Получайте удовольствие!

--jeroen

person Jeroen Wiert Pluimers    schedule 03.03.2011

Из этот ответ мы имеем

wmic path win32_localtime get dayofweek

Расширяя это на основе предложений в этой теме, мы можем установить переменная dayofweek следующим образом:

@echo off
REM Unset dayofweek in case set in a previous execution of this batch file
set dayofweek=
REM Get dayofweek into a variable.  Locale-specific:  0 is either Sunday or Monday.
for /F "skip=1 tokens=*" %%a in ('wmic path win32_localtime get dayofweek') do if not defined dayofweek set dayofweek=%%a
echo %dayofweek%

Обратите внимание, что 0 может быть воскресеньем или понедельником в зависимости от вашего региона.

person Mark Berry    schedule 31.07.2017

person    schedule
comment
действительно ли он делает это сам или пользователь должен ввести его? - person Deniz Zoeteman; 01.06.2009
comment
Я предположил, что %day% уже установлен, и он не полностью понимает ветвление. - person Randolpho; 22.05.2012