Я пытаюсь заставить командный файл выполнить пару разных команд, а затем в конце отобразить все результаты вместе.
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)
Я ценю помощь, которую может оказать каждый.
Честно говоря, даже если бы я мог понять, почему вы хотите отложить вывод каждой команды до тех пор, пока они все не будут завершены, я бы подумал, что было бы проще отправить вывод каждой команды в файл, а затем просто type
файл в конце и, возможно, delete
потом. Похоже, ваш представленный в данный момент код полагается на то, что вы уже точно знаете, сколько строк с содержимым всегда будет возвращено, и мне трудно в это поверить.
Ожидаете ли вы увидеть отдельные этапы каждой полосы индикатора выполнения для этих команд DISM, а также их повторяющуюся информацию в заголовках? И каждое из возрастающих процентных чисел прогресса SFC тоже?
@
в каждом @ECHO %Variab…
является лишним. ECHO
выключается после выполнения команды ECHO OFF
. @
означает «Выключите echo
для этой команды». Попробуйте использовать команду SET Variable
, которая отобразит значения всех переменных, имена которых начинаются Variable
. Это может указывать на то, почему изображение, которое вы сейчас видите, не соответствует ожиданиям.
1/2 Я не против, если выходные данные каждой команды отображаются тогда, когда они обычно должны, но я хочу дополнительно видеть их в самом конце после выполнения всех команд. Просто краткий и простой обзор, если все прошло как надо. Предпочтительно, чтобы вывод/ответ каждой команды временно сохранялся в переменной/памяти только для отображения один раз, а затем отбрасывался. Я не знаю, сколько строк кода будет возвращено, но предполагаю, что оно всегда будет одинаковым? Что-то вроде «операция прошла успешно» или «операция не удалась».
2/2 Мне не нужны какие-либо отдельные этапы или индикатор выполнения, только конечный результат всех операций, отображаемый в самом конце. Я пытался использовать только переменную ECHO (без @ в начале каждого ECHO), но результаты отображались дважды. Не уверен, что я сделал что-то не так...
Вам нужны последние две строки, и вы знаете, сколько их будет (здесь я доверяю вашим словам). Таким образом, вы можете пропустить первые 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.
Примечание. Это потерпит неудачу, если количество строк будет разным (в случае ошибки или другого неожиданного вывода или запуска без прав администратора (меньше строк, нечего обрабатывать))
Спасибо большое, как раз то, что мне было нужно. Хорошего дня!
@Бэтмен, если это лучший ответ, пожалуйста, поставь галочку слева в начале ответа. Это позволит другим узнать решение, которое сработало для вас. Вот как работает ТАК.
Готово, спасибо за подсказку.
Как для вас выглядят выходные данные каждого из
DISM /Online /Cleanup-Image /CheckHealth
,DISM /Online /Cleanup-Image /ScanHealth
,DISM /Online /Cleanup-Image /RestoreHealth
иSFC /scannow
? Возможно, мы сможем вам помочь. (Я бы не хотел запускать их на своей машине, если бы она у меня была). Пожалуйста, Отредактируйте свой вопрос, чтобы предоставить неизмененный вывод каждой из этих команд в поле кода. Спасибо.