【问题标题】:Built in commands fail when used in for loop内置命令在 for 循环中使用时失败
【发布时间】:2018-12-12 05:17:02
【问题描述】:

我有一部分脚本旨在删除 time /t 和 date /t 命令返回的时间中的“:”和日期中的“/”。如果我在命令提示符 (cmd.exe) 中执行命令,则会返回预期值:

C:\Windows\system32>时间 /t
下午 2:49
C:\Windows\system32>日期 /t
2018 年 7 月 3 日星期二

如果我在批处理脚本的开头放置相同的命令,我会得到预期的结果。但是,如果我在 for 语句中放置相同的命令来解析“:”和“/”。我收到以下消息:

'date /t' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 'time /t' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

在批处理文件之外运行 for 命令可以正常工作。我从头开始重新创建了批处理文件,以确保不存在随机的奇数字符。

这是脚本本身:

time /t
date /t

for /F "Tokens=2,3,4 delims=/ " %%a in ('date /t') Do Set _cdate=%%c%%a%%b
for /F "Tokens=1,2,3 delims=: " %%a in ('time /t') Do Set _ctime=%%a%%b%%c
pause

同样的脚本在另一台服务器和我的桌面上都可以正常工作。我不知道是什么让这个新服务器与众不同。 (除了一个是32位)COMSPEC是正确的。 (C:\Windows\system32\cmd.exe) 这些命令是为日志记录提供文件名前缀的较大脚本的一部分。

【问题讨论】:

  • date /t 和 time /t 命令输出取决于区域设置/用户设置。使用wmic os get LocalDateTimepowershell -nop -c "get-date -f 'yyyy-MM-dd HH:mm:SS'" 以获取所需格式的日期时间字符串。要将输出放入变量中,您需要将其包装在 for /f 命令中。在Stack Overflow中有很多她的例子
  • 使用“date /t”和“time /t”命令的脚本在另一个 Windows 2008 服务器上运行良好,因为它是在我上面的测试中编码的。我试图找出是什么导致这个新服务器失败。在多个 Windows 2008 R2 服务器上使用相同的脚本没有问题,只是这台服务器在使用 for 循环中的命令时失败。
  • 我的第一个想法是扩展被显式禁用,但会引发完全不同的错误。
  • 如果你坚持使用相当陈旧的技术,并且由于事实证明容易出错,你通常无法控制这是你的好权利 - 我建议的方法被很多管理员永久使用原因。
  • @aschipfl,是的,这就是我的观点。我不确定使用FOR /F 时禁用扩展会引发什么错误。 /F was unexpected at this time.。我刚刚测试了禁用扩展并在自己的行上运行了DATE /T。它完全搞砸了这个命令。

标签: batch-file windows-console


【解决方案1】:

您可以使用 WMIC 尝试使用此批处理脚本来获取日期和时间,而不取决于区域设置/用户设置:

@echo off
Title Get Date and Time using WMIC
Call :Get_Date_Time 
echo Date : %Year%-%Month%-%day%
echo Time : %Hour%:%Min%:%Sec%
Pause>nul & Exit
::********************************************************************************************
:Get_Date_Time
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set "MyDate=%%x"
set "Year=%MyDate:~0,4%"
set "Month=%MyDate:~4,2%"
set "Day=%MyDate:~6,2%"
set "Hour=%MyDate:~8,2%"
set "Min=%MyDate:~10,2%"
set "Sec=%MyDate:~12,2%
exit /b
::********************************************************************************************

【讨论】:

  • 我尝试使用WMIC方法,发现使用时间/t和日期/t方法返回日期和时间需要更长的时间。在我的测试中,我注意到以所需格式返回日期时间最多需要 5 秒。 WMIC 有更快的方法吗?与“老派”方法相比,不到一秒钟。我会进一步研究。
  • @gritts 使用 WMIC 的好处是它总是以相同的格式输出。 DATE 和 TIME 命令以及 DATE 和 TIME 系统变量是特定于区域和计算机的。如果我的系统设置与您的不同,您的代码将无法在我的计算机上正确运行。 WMIC 没有这个问题。您也可以尝试使用 Powershell 捕获日期和时间,但它仍然不如原生 cmd.exe 快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多