繁体   English   中英

批次%time%环境变量-问题

[英]Batch %time% env variable - Issue

我在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循环的不同迭代之间创建一些延迟,但是时间仍未更新。

不明白为什么时间变量没有被扩展! 而是存储为字符串。

谢谢。

最好的问候,达米安·巴兰(Damian Baran)

如上所述,默认情况下,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!

如在setlocal /?

批处理文件中开始本地化环境更改...

因此,setlocal命令对命令提示符没有直接影响,因此,在您的情况下,感叹号不过是一个字符串而已。

如果您启用延迟的扩展并在批处理文件中使用感叹号,它将同样有效。

好的,我认为我在这里找到了评论问题的答案: 扩展命令提示符的环境变量

感谢您的及时帮助和答复Rafael。

总结一下:

  1. setlocal仅在本地处理批处理文件(就像在docu setlocal /?中一样)
  2. 如果要直接在命令提示符下测试延迟扩展,则需要使用上述URL中所述的正确参数启动cmd.exe。

您应该如何进行?

  1. 使用以下命令(Windows运行)使用setlocal enableelayedexpansion打开cmd.exe: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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM