Моим следующим шагом будет определение (визуально) какой части каждой строки является дата, а какой - время, я имею в виду, с какой позиции начинаются подстроки и какова их длина.
В моем случае, похоже, что ... (где мой правитель?)
1 1
0 5 0 5
||||||||||||||||||||
04/10/2010 02:07 PM
Ах да, позиция 0, длина 10 для даты и позиция 11, длина 8 для времени. (Как видите, для строк в пакетных скриптах у меня есть специальная линейка, которая начинается с 0.)
Теперь, когда я знаю, где найти дату и время в выходных данных, я могу извлечь их соответствующим образом. Но сначала мне понадобится переменная для всей строки, потому что извлечение применяется к переменным среды, а не к переменным цикла. Здесь:
SETLOCAL EnableDelayedExpansion
FOR %%v IN (*.html) DO (
SET datetime=%%~tv
ECHO !datetime:~0,10!
ECHO !datetime:~11,8!
)
ENDLOCAL
Возможно, вы заметили, что помимо введения переменной я также добавил включение отложенного расширения (переменных). Это необходимо, поскольку при немедленном расширении, например, так:
FOR %%v IN (*.html) DO (
SET datetime=%%~tv
ECHO %datetime:~0,10%
ECHO %datetime:~11,8%
)
это не будет работать . Дело в том, что выражения %datetime:…%
будут оцениваться до цикла, и, следовательно, будут генерировать пустые строки. (Эта особенность поведения применима ко всем случаям, когда в скобках есть несколько команд, будь то цикл FOR
, команда IF
или IF..ELSE
или даже просто перенаправление, примененное к набору команд, как ><em>file</em> (<em>commands</em>)
.)
Вместо того, чтобы просто выводить значения, вы можете сохранить их в других переменных для последующей обработки в теле цикла:
SETLOCAL EnableDelayedExpansion
FOR %%v IN (*.html) DO (
SET datetime=%%~tv
SET fdate=!datetime:~0,10!
SET ftime=!datetime:~11,8!
:: now do whatever you like with !fdate! and !ftime!
…
)
ENDLOCAL