我正在编写一个简单的批处理脚本,以获取重新启动PC的最后日期/时间。找到了两种简单的方法:
systeminfo | find /i "Boot Time"
会输出:系统启动时间:5/4/2019,5:04:44 AM
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用户,对批处理语法一无所知。
答案 0 :(得分:1)
使用wmic可以控制所需的输出字符串,但是如果系统以前从未运行过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
您会注意到,这可能会花一点时间,通常会稍晚一些,但是我怀疑这两种方法的准确性是否至关重要。
当然,就像您说的自己是powershell一样,您也可以从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