Ключевым моментом здесь является, чтобы понять несколько загадочный синтаксис команды for
. Если вы собираетесь писать много пакетных файлов, привыкне смотреть на команду for
на for /?
. Неправильное использование команды for
- это то, как вы получаете много вещей, сделанных с помощью партии.
Итак, давайте посмотрим на первую команду:
for /f "tokens=2,3,4 delims=/ " %%i in ('date /t') do set MyDATE=%%k%%j%%i
Я просто хочу, чтобы покрыть вариант delims
. Этот параметр указывает, какие разделители искать в значениях, указанных в команде 'date /t'
. Другими словами, это то, как вы указываете команду for, где находятся токены. Обратите внимание, что это в конце списка опций? Это кажется странным, но на самом деле это важно. Поскольку разделитель разрешен как символ пробела, вы помещаете его в конец списка опций. Таким образом, это не двусмысленно. Итак, здесь разделители представляют собой пробел (
) и косую черту (/
).
Выход для date /t
как это:
Wed 10/21/2015
[Обратите внимание, что я использую США Английский регион, поэтому мои даты в M/D/Y формат.]
Опция delims разделяет вывод на любые символы разделителя. Каждый результирующий «токен» присваивается переменной, начинающейся с переменной, указанной в команде for
. Вы указали %%i
здесь, поэтому первый токен %%i
, затем %%j
и так далее. Если вы указали это:
for /f "tokens=2,3,4 delims=/ " %%a ....
Тогда жетоны будут начинаться с %%a
, то %%b
и т.д.
tokens=2,3,4
часть рассказывает для команды, которая токен для назначения переменных. Это заставит команду for
присвоить переменные.
Так что для нашей команды здесь, жетоны, как это:
Token | Value | Variable
------|-------|---------
1 | Wed | None
2 | 10 | %%i
3 | 21 | %%j
4 | 2015 | %%k
Обратите внимание, что разделители не появляются на выходе!
Это делает do
секцию изменения команды из этого:
set MyDATE=%%k%%j%%i
Для этого:
set MyDATE=20152110
сейчас, я не знаю, почему вы хотите, чтобы ваши даты в Y/D/M, но я предполагаю, что ваш регион использует D/M/Y, и вы конвертируете в Y/M/D.
Редактировать добавить:
Вы утверждаете, что этот код, убрав пространство:
@echo off
for /f "tokens=2,3,4 delims=/" %%i in ('date /t') do set MyDATE=%%k%%j%%i
echo %MYDATE%
pause
Производит этот вывод:
2015 28
Ответ заключается в том, без пробела, первый токен становится Wed 28
. Тем не менее, вы также сообщили команде for
tokens=2,3,4
, поэтому вы хотите, чтобы %%i
был вторым токеном, %%j
третий, и %%k
- четвертый токен. Это означает, что ваша таблица выглядит следующим образом:
Token | Value | Variable
------|--------|---------
1 | Wed 10 | None
2 | 28 | %%i
3 | 2015 | %%j
4 | | %%k
Обратите внимание, что %%j
получает значение 2015
с местом на конце. Это потому, что так выходят date /t
. По какой-то причине у него есть запасное пространство после года. Вы можете видеть более ясно, запустив это:
@echo off
for /f "tokens=2,3,4 delims=/" %%i in ('date /t') do (
echo "%%i"
echo "%%j"
echo "%%k"
)
, который генерирует этот вывод (опять же, США английский, поэтому даты м/д/у):
"27"
"2015 "
""
отметить также, что нет маркера 4 Когда /
является разделителем, в Wed 10/28/2015
есть только два разделителя, поэтому токен 4 является пустым значением. Вы все равно можете назначить for
, но это не особенно полезно.
Обратите внимание, что '% DATE%' и '% TIME%' являются зарезервированными переменными среды. Несмотря на то, что ваш код может работать очень хорошо, довольно сложно использовать эти переменные в вашем пакетном файле. –
Посмотрите на вывод 'date/t' и' time/t', и может быть более понятно, почему нужны разделители. – Octopus