Сценарий DOS для динамического получения имени файла и пути в зависимости от даты

Мне нужно написать какой-нибудь сценарий пакетной обработки / досмотра в Windows, который поместит файлы в поле UNIX. Но путь и имена файлов меняются каждый год и месяц соответственно в Windows.

Предположим, что каталог в Windows по пути C: / 2009MICS будет хранить файлы в течение всего года (12 файлов). Моя партия будет запускаться ежемесячно и должна собирать файлы только за соответствующие месяцы. например, если моя партия запущена в феврале 09. Он должен выбрать и передать файл за февраль из папки 2009MICS.


person Community    schedule 05.02.2009    source источник


Ответы (3)


copy "%date:~6%.txt" "\path\to\destination"

скопирует 2009.txt в путь назначения. Чтобы включить месяц, используйте

copy "%date:~3%.txt" "\path\to\destination"

Отказ от ответственности - я тестировал это на немецкой версии Win Vista, надеюсь, она также работает с международными версиями.

person Phil Reif    schedule 05.02.2009
comment
Это не имеет ничего общего с языком ОС, больше с установленной локалью. Данные о дате / времени в cmd по своей сути хрупкие, поскольку вы получаете только локализованные даты, а не культурно-нейтральные. Для меня, например, при использовании стандартных дат ISO 8601 (ГГГГ-ММ-ДД) это сломалось бы. Но я пока не нашел лучшего решения; вам просто нужно знать, что он не будет работать с разными форматами даты. - person Joey; 28.04.2009

Один из подходов - получить сегодняшнюю дату в переменных среды с помощью GetDate.cmd (в конце). Исходя из этого, вы можете сравнить переменную %mm% (текущий месяц) с месяцем метки даты файла примерно так:

  @echo off
  :: see http://ss64.com/nt/syntax-args.html
  for %%f in (*.bat) do (
     echo.
     echo Parameter '~tf' reports '%%~tf' for '%%f'

     :: see http://ss64.com/nt/for_f.html
     echo.
     for /f "tokens=1-2" %%g in ("%%~tf") do (
        echo the file date %%g
        echo the file time %%h
        )

     for /f "tokens=1-3 delims=- " %%i in ("%%~tf") do (
        echo the year     %%i
        echo the month    %%j
        echo the day      %%k
        )

     )

Результат:

  Parameter '~tf' reports '2009-08-28 11:52 AM' for 'test-date.bat'

  the file date 2009-08-28
  the file time 11:52
  the year     2009
  the month    08
  the day      28

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

  ::GetDate.cmd - Source: http://ss64.com/nt/syntax-getdate.html :
  @echo off
  SETLOCAL
  FOR /f "tokens=1-4 delims=/-. " %%G IN ('date /t') DO (call :s_fixdate %%G %%H %%I %%J)
  goto :s_print_the_date

  :s_fixdate
  if "%1:~0,1%" GTR "9" shift
  FOR /f "skip=1 tokens=2-4 delims=(-)" %%G IN ('echo.^|date') DO (
      set %%G=%1&set %%H=%2&set %%I=%3)
  goto :eof

  :s_print_the_date
  echo Month:[%mm%]  Day:[%dd%]  Year:[%yy%]
  ENDLOCAL
  SET mm=%mm%&SET dd=%dd%&SET yy=%yy%

Дальнейшее чтение:

http://ss64.com/nt/syntax-getdate.html - дата возврата в переменные среды независимо от региональных настроек даты http://ss64.com/nt/syntax-datemath.html - добавьте или вычтите дни из любой даты. http://ss64.com/nt/syntax-delolder.html - удаление файлов старше N дней из одной папки.

person Community    schedule 28.08.2009

Я вижу два разных способа интерпретировать то, что вы спрашиваете.

Зависит ли дата от дня запуска скрипта, так что на самом деле используется системная дата, или от даты файла для копируемых файлов?

Фил прав, но привязка процесса датировки к текущей дате сглазит ваш сорт, если вы не активируете sctipt в заданную дату и попытаетесь сделать это позже, например, 1 марта ...

для файловой части я бы сделал что-то вроде:

@echo off
setlocal ENABLEDELAYEDEXPANSION
pushd C:\2009MICS
for /F "delims=" %%f in ('dir /b /a-d') do (
    for /f "tokens=2 delims=- " %%t in ("%%~tf") do set TimeStamp=%%t
    if not exist !TimeStamp!\ mkdir !TimeStamp!\
    copy %%f !TimeStamp!\ >nul
)
exit /b

Надеюсь, я правильно понял вопрос, иначе это начало прямо здесь :)

person Jay    schedule 20.08.2009