Выполнить несколько команд и записать вывод в виде одной строки на Windows пакет - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь запустить команду 1 (wmi c diskdrive get status) и команду 2 (wmi c OS GET LocalDateTime / VALUE) и записать вывод в виде одной строки в файл.

справочная информация Мне нужно отслеживать состояние SMART с активным агентом zabbix. Windows версия одна без PowerShell, и у меня там очень ограниченные права пользователя. У меня есть около 50 машин, которые мне нужно контролировать, и скрипт .bat - самое жизнеспособное решение, которое у меня есть

Справочная информация заканчивается

@echo off
setlocal EnableExtensions EnableDelayedExpansion


set "INTEXTFILE=c:\zabbix\smart_log.txt"
set "OUTTEXTFILE=c:\zabbix\smart_log_out.txt"
(wmic diskdrive get status 
wmic OS GET LocalDateTime /VALUE) 1> %INTEXTFILE%

Все идет нормально. Я получаю smart_log.txt с информацией:

Status  
OK      


LocalDateTime=20200114155453.199000+120

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

setlocal EnableDelayedExpansion
set row=
for /f %%x in (%INTEXTFILE%) do set "row=!row! %%x"
>%OUTTEXTFILE% echo %row%

Все, что я там получаю:

ECHO is off.

Моя цель - получить файл со строкой:

Status OK (*maybe multiple OK OK OK if there are many disks)  LocalDateTime=20200114155453.199000+120

1 Ответ

2 голосов
/ 14 января 2020
@echo off
setlocal enabledelayedexpansion
set "line="
for /f "delims=" %%a in ('wmic diskdrive get status^|more') do set "line=!line!%%a,"
for /f "delims=" %%a in ('wmic OS GET LocalDateTime /value ^| more') do set  line=!line!%%a
set "line=%line: =%"
echo %line:,= %

Вывод wmic как обычного окончания строки (CRCRLF вместо CRLF), что усложняет ситуацию. Трубопровод к more "исправляет" эти окончания строки. Затем просто соедините строки. Чтобы украсить (и адаптировать к нужному формату), создайте строки с другим разделителем (запятая здесь), удалите все пробелы и замените запятые на пробелы.

Вывод в моей системе:

Status OK OK OK  LocalDateTime=20200114165152.456000+060

Подсказка: меняется на delims=. за секунду for l oop (дата), изменяет вывод на:

Status OK OK OK  LocalDateTime=20200114165555
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...