Пакет% time% env variable - Проблема

У меня проблема с печатью переменной окружения% time% внутри цикла FOR. Я не уверен, связано ли это с setlocal enabledelayedexpansion, но это похоже.

Я пытаюсь понять это в CMD.exe не в сценарии.bat.

Без setlocal enabledelayedexpansion это выглядит так:

C:\Users\dabaran\Desktop\cs50\src\C>for /L %i in (1,1,3) do echo [%time%]

C:\Users\dabaran\Desktop\cs50\src\C>echo [21:47:27,19]
[21:47:27,19]

C:\Users\dabaran\Desktop\cs50\src\C>echo [21:47:27,19]
[21:47:27,19]

C:\Users\dabaran\Desktop\cs50\src\C>echo [21:47:27,19]
[21:47:27,19]

C:\Users\dabaran\Desktop\cs50\src\C>

Если я попытаюсь использовать setlocal enabledelayedexpansion, он выглядит следующим образом:

C:\Users\dabaran\Desktop\cs50\src\C>Setlocal EnableDelayedExpansion

C:\Users\dabaran\Desktop\cs50\src\C>for /L %i in (1,1,3) do echo !time!

C:\Users\dabaran\Desktop\cs50\src\C>echo !time!
!time!

C:\Users\dabaran\Desktop\cs50\src\C>echo !time!
!time!

C:\Users\dabaran\Desktop\cs50\src\C>echo !time!
!time!

C:\Users\dabaran\Desktop\cs50\src\C>

Я также пытался использовать таймаут, чтобы создать некоторую задержку между различными итерациями цикла for, но время все еще не обновляется.

Не понимаю, почему переменная времени не расширяется! но вместо этого сохраняется как строка.

Спасибо.

С наилучшими пожеланиями, Дамиан Баран

3 ответа

Как и в setlocal/? :

Начинает локализацию изменений среды в пакетном файле...

Таким образом, команда setlocal не влияет непосредственно на командную строку, поэтому восклицательные знаки - это не что иное, как строка в вашем случае.

Если вы включите замедленное расширение и используйте восклицательные знаки в пакетном файле, он также будет работать.


Как указано выше, по умолчанию setlocal применяется только в пакетном файле. Но если вы хотите использовать его в командной строке, вы можете создать и изменить запись в реестре и использовать ее с cmd.exe. Смотри ниже.

EnableDelayedExpansion также может быть установлен в реестре под HKLM или HKCU:

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"DelayedExpansion"= (REG_DWORD)
1=enabled 0=disabled (default)

Пример -

C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /V Delayedexpansion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
 Delayedexpansion REG_DWORD 0x1

C:\>for /L %i in (1,1,5) do echo !time!

C:\>echo !time!
54:23.9

C:\>echo !time!
54:23.9

C:\>echo !time!
54:23.9

C:\>echo !time!
54:23.9

C:\>echo !time!
54:23.9

С настройкой по умолчанию

C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /V Delayedexpansion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
 Delayedexpansion REG_DWORD 0x0


C:\>for /L %i in (1,1,5) do echo !time!

C:\>echo !time!
!time!

C:\>echo !time!
!time!

C:\>echo !time!
!time!

C:\>echo !time!
!time!

C:\>echo !time!
!time!


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

Благодарим вас за вашу большую и оперативную помощь/ответ Рафаэля.

Обобщить:

  1. setlocal работает локально только для пакетных файлов (как в файле setlocal/?)
  2. если вы хотите протестировать задержанное расширение в командной строке напрямую, вам нужно запустить cmd.exe с правильным аргументом, как описано выше.

Как вы должны действовать?

  1. Откройте cmd.exe с помощью setlocal enabledelayedexpansion со следующей командой (Windows Run): cmd.exe/V: ON
  2. Проверьте свой код, который использует отложенное расширение

Мой результат выглядит неплохо сейчас:

C:\Windows\system32>for /L %i in (1,1,5) do echo !time!

C:\Windows\system32>echo !time!
22:56:37,71

C:\Windows\system32>echo !time!
22:56:37,73

C:\Windows\system32>echo !time!
22:56:37,77

C:\Windows\system32>echo !time!
22:56:37,78

C:\Windows\system32>echo !time!
22:56:37,79

C:\Windows\system32>

licensed under cc by-sa 3.0 with attribution.