Сохраняйте выходные данные нескольких пакетных команд в переменных

Я пытаюсь заставить командный файл выполнить пару разных команд, а затем в конце отобразить все результаты вместе.

SETLOCAL ENABLEDELAYEDEXPANSION
SET Counter=1
FOR /F "tokens=* USEBACKQ" %%F IN (`DISM /Online /Cleanup-Image /CheckHealth`) DO (
  SET "VariableA!Counter!=%%F"
  SET /a Counter=!Counter!+1)

SET Counter=1
FOR /F "tokens=* USEBACKQ" %%F IN (`DISM /Online /Cleanup-Image /ScanHealth`) DO (
  SET "VariableB!Counter!=%%F"
  SET /a Counter=!Counter!+1)

SET Counter=1
FOR /F "tokens=* USEBACKQ" %%F IN (`DISM /Online /Cleanup-Image /RestoreHealth`) DO (
  SET "VariableC!Counter!=%%F"
  SET /a Counter=!Counter!+1)

SET Counter=1
FOR /F "tokens=* USEBACKQ" %%F IN (`SFC /scannow`) DO (
  SET "VariableD!Counter!=%%F"
  SET /a Counter=!Counter!+1)

@ECHO %VariableA4%
@ECHO %VariableA5%
@ECHO %VariableB4%
@ECHO %VariableB5%
@ECHO %VariableC4%
@ECHO %VariableC5%
@ECHO %VariableD3%
@ECHO %VariableD4%

ENDLOCAL
pause

Я попробовал код, опубликованный выше, но получил результат только по первым двум переменным
@ECHO %VariableA4% & @ECHO %VariableA5% Все последующие переменные ничего не отображали/не получали никаких значений из 2-й, 3-й и 4-й команды.

Обычный вывод каждой команды:
DISM/Online/Cleanup-Image/CheckHealth

C:\WINDOWS\system32>DISM /Online /Cleanup-Image /CheckHealth

Deployment Image Servicing and Management tool
Version: 10.0.19041.3636

Image Version: 10.0.19045.4529

No component store corruption detected.
The operation completed successfully.

DISM/Онлайн/Очистка-Изображение/ScanHealth

C:\WINDOWS\system32>DISM /Online /Cleanup-Image /ScanHealth

Deployment Image Servicing and Management tool
Version: 10.0.19041.3636

Image Version: 10.0.19045.4529

[==========================100.0%==========================] No component store corruption detected.
The operation completed successfully.

DISM/Online/Cleanup-Image/RestoreHealth

C:\WINDOWS\system32>DISM /Online /Cleanup-Image /RestoreHealth

Deployment Image Servicing and Management tool
Version: 10.0.19041.3636

Image Version: 10.0.19045.4529

[==========================100.0%==========================] The restore operation completed successfully.
The operation completed successfully.

SFC /сканноу

C:\WINDOWS\system32>SFC /scannow

Beginning system scan.  This process will take some time.

Beginning verification phase of system scan.
Verification 100% complete.

Windows Resource Protection did not find any integrity violations.

Моя цель — сделать так, чтобы в самом конце окно CMD отображало что-то вроде этого:

    CheckHealth:
    No component store corruption detected.
    The operation completed successfully.
    (only line 4 and 5 of the normal command output)

    ScanHealth
    No component store corruption detected.
    The operation completed successfully.
    (only line 4 and 5 of the normal command output)

    RestoreHealth
    The restore operation completed successfully.
    The operation completed successfully.
    (only line 4 and 5 of the normal command output)

    SFC /scannow
    Verification 100% complete.
    Windows Resource Protection did not find any integrity violations.
    (only line 3 and 4 of the normal command output)

Я ценю помощь, которую может оказать каждый.

Как для вас выглядят выходные данные каждого из DISM /Online /Cleanup-Image /CheckHealth, DISM /Online /Cleanup-Image /ScanHealth, DISM /Online /Cleanup-Image /RestoreHealth и SFC /scannow? Возможно, мы сможем вам помочь. (Я бы не хотел запускать их на своей машине, если бы она у меня была). Пожалуйста, Отредактируйте свой вопрос, чтобы предоставить неизмененный вывод каждой из этих команд в поле кода. Спасибо.

Compo 14.06.2024 14:24

Честно говоря, даже если бы я мог понять, почему вы хотите отложить вывод каждой команды до тех пор, пока они все не будут завершены, я бы подумал, что было бы проще отправить вывод каждой команды в файл, а затем просто type файл в конце и, возможно, delete потом. Похоже, ваш представленный в данный момент код полагается на то, что вы уже точно знаете, сколько строк с содержимым всегда будет возвращено, и мне трудно в это поверить.

Compo 14.06.2024 14:46

Ожидаете ли вы увидеть отдельные этапы каждой полосы индикатора выполнения для этих команд DISM, а также их повторяющуюся информацию в заголовках? И каждое из возрастающих процентных чисел прогресса SFC тоже?

Compo 14.06.2024 15:02

@ в каждом @ECHO %Variab… является лишним. ECHOвыключается после выполнения команды ECHO OFF. @ означает «Выключите echo для этой команды». Попробуйте использовать команду SET Variable, которая отобразит значения всех переменных, имена которых начинаются Variable. Это может указывать на то, почему изображение, которое вы сейчас видите, не соответствует ожиданиям.

Magoo 14.06.2024 19:09

1/2 Я не против, если выходные данные каждой команды отображаются тогда, когда они обычно должны, но я хочу дополнительно видеть их в самом конце после выполнения всех команд. Просто краткий и простой обзор, если все прошло как надо. Предпочтительно, чтобы вывод/ответ каждой команды временно сохранялся в переменной/памяти только для отображения один раз, а затем отбрасывался. Я не знаю, сколько строк кода будет возвращено, но предполагаю, что оно всегда будет одинаковым? Что-то вроде «операция прошла успешно» или «операция не удалась».

Batman 17.06.2024 12:20

2/2 Мне не нужны какие-либо отдельные этапы или индикатор выполнения, только конечный результат всех операций, отображаемый в самом конце. Я пытался использовать только переменную ECHO (без @ в начале каждого ECHO), но результаты отображались дважды. Не уверен, что я сделал что-то не так...

Batman 17.06.2024 12:20
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
0
6
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужны последние две строки, и вы знаете, сколько их будет (здесь я доверяю вашим словам). Таким образом, вы можете пропустить первые n (ненужные) строки. Вам просто придется отфильтровать строки прогресса, потому что вы не знаете (или не хотите считать), сколько их.

Я взял на себя смелость немного адаптировать ваш метод счетчика.

@echo off
setlocal enabledelayedexpansion
set counter=0
FOR /F "skip=5 tokens=* USEBACKQ" %%F IN (`dism /online /cleanup-image /checkhealth`) DO (
  SET /a Counter+=1
  SET "Variable!Counter!=%%F"
)
FOR /F "skip=5 tokens=* USEBACKQ" %%F IN (`DISM /Online /Cleanup-Image /ScanHealth^|find /v "["`) DO (
  SET /a Counter+=1
  SET "Variable!Counter!=%%F"
)
  set variable
  set counter
echo ====== Summary ======
echo checkhealth:
echo %variable1%
echo %variable2%
echo scanhealth:
echo %variable3%
echo %variable4%
echo etc.

Примечание. Это потерпит неудачу, если количество строк будет разным (в случае ошибки или другого неожиданного вывода или запуска без прав администратора (меньше строк, нечего обрабатывать))

Спасибо большое, как раз то, что мне было нужно. Хорошего дня!

Batman 18.06.2024 13:30

@Бэтмен, если это лучший ответ, пожалуйста, поставь галочку слева в начале ответа. Это позволит другим узнать решение, которое сработало для вас. Вот как работает ТАК.

lit 18.06.2024 20:28

Готово, спасибо за подсказку.

Batman 20.06.2024 09:36

Другие вопросы по теме