Вопрос или проблема
Я пытаюсь создать *.bat для обслуживания некоторых операционных систем, используя sfc.exe /scannow, который предоставлен Майкрософт в Windows. Процесс возвращает 0 в качестве кода завершения, независимо от того, прошла ли проверка целостности файлов ОС или нет, поэтому я подумываю использовать часть или всю обратную информацию в первой строке в качестве “условного оператора”, чтобы определить, если системные файлы повреждены, показать сообщение вроде “позвоните мне для восстановления системы”, а если все работает хорошо, сделать что-то другое, например, очистить некоторые мусорные папки, начинающиеся с ~1 в C:\Windows\Temp.
Вот что я сделал
@ECHO OFF
title Обслуживание системных файлов.
sc config trustedinstaller start= auto
net start Trustedinstaller
PUSHD %~DP0 & cd /d “%~dp0”
%1 %2
mshta vbscript:createobject(“shell.application”).shellexecute(“%~s0″,”goto :runas”,””,”runas”,1)(window.close)&goto :eof
:runas
start “” /wait /b “C:\Windows\System32\sfc.exe” /scannow
нужна.реальная.помощь.внизу
if “%Condition:~0,0%”==””
mshta vbscript:msgbox(“некоторые системные файлы повреждены и не могут быть восстановлены, пожалуйста, позвоните XXXX для восстановления системы.”,4096,”Проверка системных файлов не выполнена”)(window.close)
) else (
нужна.реальная.помощь.здесь
)
pause >nul
:exit
кстати, я пытался добавить /min после Start, как
start “” /min /wait /b “C:\Windows\System32\sfc.exe” /scannow
я надеюсь, что все окно выполнения будет уменьшено и минимально, но это не работает
Ответ или решение
Чтобы успешно использовать оператор if
для получения информации о результатах выполнения команды sfc.exe /scannow
в вашем бат-файле, вам нужно учитывать, что sfc.exe
вернет текстовую информацию, а не статус завершения, который можно проверить через переменную условия. Разберем, как вы можете это реализовать.
1. Исполнение команды и снятие информации
Чтобы получить результат выполнения команды sfc
, вы можете перенаправить вывод команды в текстовый файл. Затем в дальнейшем скрипте вы сможете проверить этот файл на наличие определенных ключевых слов для принятия решения.
@ECHO OFF
title Systemfile Maintenance
:: Запускаем TrustedInstaller
sc config trustedinstaller start= auto
net start TrustedInstaller
PUSHD %~DP0 & cd /d "%~dp0"
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :eof
:runas
:: Выполняем проверку целостности файлов системы и сохраняем вывод в лог-файл
start "" /wait /b "C:\Windows\System32\sfc.exe" /scannow > C:\Windows\Temp\sfc_results.txt
:: Чтение файла с результатами
setlocal EnableDelayedExpansion
set "result="
for /f "delims=" %%i in (C:\Windows\Temp\sfc_results.txt) do (
set "line=%%i"
echo !line! | find "Найдено поврежденных файлов" >nul && set "result=corrupted"
echo !line! | find "Целостность файлов системы не нарушена" >nul && set "result=ok"
)
:: Проверяем результат
if "!result!" == "corrupted" (
mshta vbscript:msgbox("Некоторые системные файлы повреждены и не могут быть восстановлены. Пожалуйста, позвоните XXXX для восстановления системы.",4096,"Проверка системных файлов завершилась неудачно")(window.close)
) else (
:: Здесь вы можете добавить логику для очистки временных файлов
echo Очищаем временные файлы...
del /q C:\Windows\Temp\~1*
)
pause >nul
:end
2. Пояснение кода
-
Перенаправление вывода: Использование
>
для перенаправления результата командыsfc.exe
в файлsfc_results.txt
. Это позволяет вам позже анализировать вывод. -
Переменная
result
: Мы устанавливаем пустую переменнуюresult
, которая будет изменяться в зависимости от результата проверки. -
Цикл
for
: Этот цикл считывает строки из файла. Мы используемfind
для поиска определенных фраз в строках. В зависимости от найденного текста, переменнойresult
присваивается значениеcorrupted
илиok
. -
Условия
if
: После получения результата мы используем операторif
для проверки переменнойresult
и принимаем необходимые меры.
3. Вопрос о минимизации окна
Чтобы минимизировать окно командной строки, вы можете использовать команду start
с /min
, как показано в вашем примере, однако это не всегда срабатывает для внешних процессов. В данном случае это может зависеть от конкретного окружения Windows.
Заключение
Данный подход позволит вам получать и обрабатывать результаты команды sfc.exe
, чтобы эффективно взаимодействовать с пользователем в зависимости от состояния системных файлов. Использование mshta
для отображения сообщений также создает удобный интерфейс для взаимодействия с пользователем.