Невозможно создать переменную запятую в пакете, если используется% time% - PullRequest
0 голосов
/ 27 января 2020

Я работал над сценарием, который мне нужен для считывания времени из системы за секунды, но не за миллисекунды. Я заметил, что некоторые компьютеры имеют разные настройки региона, что вызвало у меня несколько проблем, например, когда дата с одного компьютера отображается как 01/01/2020, на другом - 01.01.2020 с помощью команды %date% et c.

То же самое, если я использую команду %time%, на некоторых компьютерах отображается время, например 12:13:14,15, на некоторых - 12:13:14.16.

Теперь, чтобы решить эту проблему, мне нужно создать переменную прочитать символ разделителя и вывести правильный. Для даты команды Это было просто.

Для времени у меня есть эта команда:

FOR /F "tokens=3 delims=0123456789" %%A IN ('echo %time%') DO set timeSeparatorSymbol=%%A

Если на компьютере есть символ для разделителя для миллисекунд, как ., тогда вывод:

timeSeparatorSymbol=.

Что хорошо.

Если на компьютере символ разделителя для миллисекунд обозначен как ,, то на выходе будет:

timeSeparatorSymbol=

Как видите, переменная не создана, и я изо всех сил пытаюсь выяснить, почему запятая не принимает ее как переменную.

Мне нужно это, чтобы следующий скрипт работал на всех компьютерах независимо от региональных настроек:

for /f "tokens=3 delims=:%timeSeparatorSymbol%" %%A in ('echo %time%') do set second=%%A

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 27 января 2020

После перечитывания вашего вопроса и исходя из моей интерпретации, ваша единственная проблема - это разница в типах разделителей между секундами и миллисекундами, и что они всегда либо ,, либо ., я бы предложил эту альтернативу:

For /F "Tokens=3 Delims=:" %%A In ("%TIME:,=.%") Do Set "second=%%~nA"

Если вы хотите указывать метку времени как hms, то, возможно, этого будет достаточно:

For %%A In ("%TIME:,=.%") Do Set "TimeStamp=%%~nA"

Если вы просто хотите убедитесь, что %TIME% всегда использует . вместо ,, просто используйте переменную прямо так: %TIME:,=.%

0 голосов
/ 27 января 2020

Ваш вопрос имеет много возможностей для предположений и толкований.

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

Вы заявляете, что формат всегда hh:mm:ss?xx, так что вы можете легко извлечь нужный разделитель (?) с помощью:

set "timeSeparatorSymbol=%time:~8,1%"

то же самое для date вы утверждаете, что это "всегда DD?MM?YYYY):

set "dateSeparatorSymbol=%date:~2,1%"

Конечно, это не работает, когда формат даты отличается от вашего заявления (как, например, Mon, 27.01.2020. %date:~-5,1% работает до тех пор, пока строка даты заканчивается на 4 di git Year и там является разделителем раньше)

0 голосов
/ 27 января 2020

Если бы вы искали этот сайт, вы бы нашли огромное количество вопросов и ответов, требующих метод возврата даты и / или времени в согласованном формате.

В приведенном ниже методе показан один такой метод чтобы получить текущее время в формате hh:mm:ss, он использует robocopy.exe в виде ссылки @ Mofi в своем недавнем комментарии :

@Set "TimeStamp="
@For /F "Tokens=2" %%A In (
    '^""%__AppDir__%Robocopy.exe" /NJH /L "\|" Null^"'
) Do @If Not Defined TimeStamp Set "TimeStamp=%%A"
@Echo=%TimeStamp%
@Timeout 5

Если вы не не хотите, чтобы «сложность» была надежной, попробуйте следующее:

For /F "Tokens=2" %%A In ('RoboCopy /NJH /L "\|" Null^|Find ":"') Do Set "TimeStamp=%%A"


Если вы хотите получить только секунды, то есть ss, (это не ясно из вашего вопроса ) :
@Set "Seconds="
@For /F "Tokens=4Delims=: " %%A In (
    '^""%__AppDir__%Robocopy.exe" /NJH /L "\|" Null^"'
) Do @If Not Defined Seconds Set "Seconds=%%A"
@Echo=%Seconds%
@Timeout 5

… и снова без «усложнения»:

For /F "Tokens=4Delims=: " %%A In ('RoboCopy /NJH /L "\|" Null^|Find ":"') Do Set "Seconds=%%A"
...