如何格式化Windows批处理脚本中的日期/时间输出?

时间:2019-05-04 14:49:39

标签: datetime batch-file command-line formatting wmic

我正在编写一个简单的批处理脚本,以获取重新启动PC的最后日期/时间。找到了两种简单的方法:

  1. systeminfo | find /i "Boot Time"会输出:

系统启动时间:5/4/2019,5:04:44 AM

  1. wmic os get lastbootuptime会输出:

LastBootUpTime

20190504050444.500000-420

我基本上是想将第二个输出的格式设置为与第一个相同或相似(可读)。在较新的PC上,第一台PC可以正常工作,但我们的大多数客户仍在运行Windows 7,第一台PC永远需要加载,而第二台PC即使在Windows 7之前的操作系统上也要立即加载。

我当时正在考虑将第二个变量的输出放到变量中并做正则表达式:

for /f %%i in ('wmic os get lastbootuptime') do set lastboottime=%%i

但是我不断收到"%%i was unexpected at this time"错误。我是PowerShell用户,对批处理语法一无所知。

1 个答案:

答案 0 :(得分:1)

使用可以控制所需的输出字符串,但是如果系统以前从未运行过WMIC,则可能需要一些时间才能运行。

您面临的问题归因于WMIC输出中使用的行尾,只需将变量If设置为尚未Defined就可以解决此问题,(仅设置输出的第一行)

@Echo Off
Set "LBT="
For /F EOL^=L %%A In ('""%__AppDir__%wbem\wmic.exe" OS Get LastBootUpTime 2>Nul"
')Do If Not Defined LBT Set "LBT=%%~nA"
Echo System Boot Time: %LBT:~,4%/%LBT:~4,2%/%LBT:~6,2%, %LBT:~8,2%:%LBT:~10,2%:%LBT:~-2%
Pause

您可以在DOSTips上详细了解WMIC行结尾的问题,并提供有关克服该问题的其他建议。

但是,作为替代方案,如果不使用SystemInfo,则您可能更喜欢net.exe的输出:

@Echo Off
For /F EOL^=^ Skip^=1Delims^= %%A In ('""%__AppDir__%net.exe" Statistics Work"
')Do If Not Defined _lb For %%B In (%%A
)Do Echo=%%B|"%__AppDir__%findstr.exe" "[0-9][0-9]">Nul&&(
    Call Set "_lb=%%_lb%% %%B")
Echo System Boot Time: %_lb%
Pause

您会注意到,这可能会花一点时间,通常会稍晚一些,但是我怀疑这两种方法的准确性是否至关重要。

当然,就像您说的自己是一样,您也可以从中轻松使用它。

@Echo Off
For /F Delims^= %%A In ('
    PowerShell -NoP "GWMI Win32_OperatingSystem|Select @{e={$_.ConvertToDateTime($_.LastBootUpTime)}}"
')Do Set "BUT=%%A"
Echo System Boot Time: %BUT%
Pause

+:

@Echo Off
For /F Delims^= %%A In ('PowerShell -NoP "(GCIM Win32_OperatingSystem).LastBootUpTime"')Do Set "LSB=%%A"
Echo System Boot Time: %LSB%
Pause