如何在 Windows 批处理脚本中格式化 date/time 输出?
How to format date/time output in a Windows batch script?
我正在编写一个简单的批处理脚本来获取最后 date/time PC 重新启动的时间。找到两个简单的方法:
systeminfo | find /i "Boot Time"
输出:
系统启动时间:5/4/2019,5:04:44上午
wmic os get lastbootuptime
输出:
上次启动时间
20190504050444.500000-420
我主要是想将第二个输出的格式设置为与第一个相同或相似(可读)。在较新的 PC 上,第一个工作正常,但我们的大多数客户仍然 运行 Windows 7 并且第一个需要很长时间才能加载,而第二个即使在 OS 比 Windows 7 岁大。
我正在考虑将第二个的输出放入变量并执行正则表达式:
for /f %%i in ('wmic os get lastbootuptime') do set lastboottime=%%i
但我一直收到 "%%i was unexpected at this time"
错误。我是 PowerShell 用户,对批处理语法一无所知。
使用wmic可以让你控制你想要的输出字符串,但它可能需要一些时间才能运行,如果系统之前从未运行 WMIC
.
您遇到的问题是由于 WMIC
输出中使用的行尾,这可以通过设置变量 If
来简单解决,它还没有 [=17] =], (只设置第一行输出):
@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
您会注意到,这可能会给出稍微不同的时间,通常会晚一点,但我怀疑这两种方法的准确性是否至关重要。
当然,正如你所说,你也是 powershell guy, you could just as easily use that from a batch-file。
@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
我正在编写一个简单的批处理脚本来获取最后 date/time PC 重新启动的时间。找到两个简单的方法:
systeminfo | find /i "Boot Time"
输出:
系统启动时间:5/4/2019,5:04:44上午
wmic os get lastbootuptime
输出:
上次启动时间
20190504050444.500000-420
我主要是想将第二个输出的格式设置为与第一个相同或相似(可读)。在较新的 PC 上,第一个工作正常,但我们的大多数客户仍然 运行 Windows 7 并且第一个需要很长时间才能加载,而第二个即使在 OS 比 Windows 7 岁大。
我正在考虑将第二个的输出放入变量并执行正则表达式:
for /f %%i in ('wmic os get lastbootuptime') do set lastboottime=%%i
但我一直收到 "%%i was unexpected at this time"
错误。我是 PowerShell 用户,对批处理语法一无所知。
使用wmic可以让你控制你想要的输出字符串,但它可能需要一些时间才能运行,如果系统之前从未运行 WMIC
.
您遇到的问题是由于 WMIC
输出中使用的行尾,这可以通过设置变量 If
来简单解决,它还没有 [=17] =], (只设置第一行输出):
@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
您会注意到,这可能会给出稍微不同的时间,通常会晚一点,但我怀疑这两种方法的准确性是否至关重要。
当然,正如你所说,你也是 powershell guy, you could just as easily use that from a batch-file。
@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