Использование 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
Вы можете прочитать немного больше о проблеме окончания строки WMIC
, обратившись к DOSTips , а также к другим предложениям по преодолению проблемы..
Однако в качестве альтернативы и без использования 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 парень, выможет также легко использовать это из пакетного файла тоже.
powershell-v2.0
@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
powershell-v3.0 +:
@Echo Off
For /F Delims^= %%A In ('PowerShell -NoP "(GCIM Win32_OperatingSystem).LastBootUpTime"')Do Set "LSB=%%A"
Echo System Boot Time: %LSB%
Pause