Как отформатировать дату / время в пакетном скрипте Windows? - PullRequest
0 голосов
/ 04 мая 2019

Я пишу простой пакетный скрипт для получения последней даты / времени перезагрузки ПК. Нашли два простых способа:

  1. systeminfo | find /i "Boot Time" который выводит:

Время загрузки системы: 04.05.2009, 5:04:44

  1. wmic os get lastbootuptime который выводит:

LastBootUpTime

20190504050444.500000-420

В основном я хочу отформатировать вывод второго так, чтобы он был таким же или похожим на первый (что-то читаемое). На более новых компьютерах первый работает нормально, но большинство наших клиентов все еще работают под управлением Windows 7, и загрузка первого занимает вечность, в то время как второй работает довольно быстро даже на ОС старше Windows 7.

Я думал о выводе второй переменной в переменную и выполнял регулярные выражения:

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

но я получаю "%%i was unexpected at this time" ошибку. Я пользователь PowerShell и понятия не имею о пакетном синтаксисе.

1 Ответ

1 голос
/ 04 мая 2019

Использование дает вам контроль над желаемой выходной строкой, но ее запуск может занять некоторое время, если система никогда не выполняла 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

Вы заметите, что это можетдайте немного другое время, обычно немного позже, но я сомневаюсь, что точность любого из этих методов была бы критической.

Конечно, как вы говорите, вы парень, выможет также легко использовать это из тоже.

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...