批量%time%env变量 - 问题

时间:2014-12-25 20:58:16

标签: loops variables batch-file for-loop

我在FOR循环中打印环境变量%time%时遇到问题。我不确定它是否与 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 个答案:

答案 0 :(得分:2)

如上所述,默认情况下,setlocal仅适用于批处理文件。但是如果你想在命令提示符下使用它,你可以创建&修改注册表项并将其与cmd.exe一起使用。见下文。

也可以在HKLM或HKCU下的注册表中设置EnableDelayedExpansion:

[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 :(得分:1)

setlocal /?

一样
  

批处理文件 ...

中开始环境变更的本地化

因此,setlocal命令不会直接对命令提示符产生影响,因此感叹号在您的情况下不仅仅是 String

如果启用延迟扩展并在批处理文件中使用感叹号,它也可以正常工作。

答案 2 :(得分:1)

好的,我想我在这里找到了我的评论问题的答案: Expanding environment variables for command prompt

感谢您的出色帮助/回复Rafael。

总结:

  1. setlocal仅在本地为批处理文件工作(因为它在docu setlocal /?中)
  2. 如果要直接在命令提示符中测试延迟扩展,则需要使用上述URL中所述的正确参数启动cmd.exe。
  3. 您应如何继续?

    1. 使用setlocal enabledelayedexpansion使用以下命令打开cmd.exe(Windows运行):cmd.exe / V:ON
    2. 测试使用延迟扩展的代码
    3. 我的输出现在看起来很不错:

      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>