Скрипт DOS, принимающий имя файла и путь, основанный на дате - PullRequest
1 голос
/ 05 февраля 2009

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

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

Ответы [ 3 ]

1 голос
/ 28 августа 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 дней из одной папки

1 голос
/ 05 февраля 2009
copy "%date:~6%.txt" "\path\to\destination"

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

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

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

0 голосов
/ 20 августа 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

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

...