2015-10-21 3 views
0

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

20152210 
0242 AM 

код:

@echo off 

for /f "tokens=2,3,4 delims=/ " %%i in ('date /t') do set DATE=%%k%%j%%i 
for /f "tokens=1,2,3 delims=:." %%i in ('time /t') do set TIME=%%i%%j%%k 

echo %DATE% 
echo %TIME% 

Я не понимаю, часть delims=/ " и delims=:.", где два символа используются в качестве разделителей, который в свою очередь, дает правильный вывод.

Может ли кто-нибудь объяснить мне часть delims=/ " и delims=:."?

+3

Обратите внимание, что '% DATE%' и '% TIME%' являются зарезервированными переменными среды. Несмотря на то, что ваш код может работать очень хорошо, довольно сложно использовать эти переменные в вашем пакетном файле. –

+2

Посмотрите на вывод 'date/t' и' time/t', и может быть более понятно, почему нужны разделители. – Octopus

ответ

0

Команда delims может использовать более одного символа, например, «abcd + efg + hijk; lmno; pqr» может быть разбита с использованием «delims =; +» (от here). Таким образом, здесь могут быть два символа используются оба, когда они достигнуты. Либо один, либо другой, в разных частях. Например, время может быть написано как 22: 03.30 или 22.03: 30, и они работают. Пробел и слэш с датой и: или. со временем.

Как комментарий говорит, что лучше использовать несистемные вары для собственного кода:

@echo off 

for /f "tokens=2,3,4 delims=/ " %%i in ('date /t') do set MYDATE=%%k%%j%%i 
for /f "tokens=1,2,3 delims=:." %%i in ('time /t') do set MYTIME=%%i%%j%%k 

echo %MYDATE% 
echo %MYTIME% 
+1

Для полноты вы должны также упомянуть, что последовательные разделители рассматриваются как один разделитель; например, при определении 'tokens = 1,2 delims =,' ',' abc,; ,, def' вернет две части 'abc' и' def' ... – aschipfl

+0

Да, спасибо! –

0

Ключевым моментом здесь является, чтобы понять несколько загадочный синтаксис команды 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. Тем не менее, вы также сообщили команде fortokens=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, но это не особенно полезно.

+0

Hi, Прежде всего, спасибо, что объяснили. Но когда я удаляю пространство, я получаю следующий вывод. @echo от для/ф "токенов = 2,3,4 delims = /" %% я в ('Дата/т') делать множество MyDate = %% %% K J %% я эхо% MYDATE% pause ouput is -> 2015 28 может у вас объяснить, почему это так? – learntolive

+0

@learntolive См. Мое редактирование. –

+0

благодарит много бекона – learntolive

Смежные вопросы