Page 1 of 1
read sfc output
Posted: 30 Mar 2021 15:24
by einstein1969
Hi,
I need to read the output of the command "sfc /scannow" with dos batch/powershell.
I have searched the web and there are some solutions but nothing very clear to me.
i would use dos batch commands if possible and powershell as well.
It is possible?
Einstein1969
Re: read sfc output
Posted: 30 Mar 2021 15:31
by Squashman
The first thing I would check if it is writing everything to the STDOUT, STDERR or CON. If you redirect standard error to a file, then you know it is writing to STDERR. If your redirect STDOUT to a file and it doesn't go to file then it is writing directly to the console and you will not be able to capture the output.
Re: read sfc output
Posted: 30 Mar 2021 16:02
by aGerman
I'm not sure if that is something you can make use of. However, sfc already writes to the cbs.log file. You just have to filter the entries that contain the [SR] tag.
https://docs.microsoft.com/en-us/troubl ... le-entries
Steffen
Re: read sfc output
Posted: 31 Mar 2021 03:06
by einstein1969
@squashman
This is the output on console when execute "sfc /scannow" on cmd windows:
Code: Select all
Avvio in corso dell'analisi del sistema. Attendere. L'operazione richiederà alcuni minuti.
Avvio in corso della fase di verifica dell'analisi del sistema.
2% della verifica completato.
- Is there a way to capture the CMD screen buffer (with powershell or other)? That is to automate the copy and paste we do with the mouse?
When i redirect on file "sfc /scannow >out.log 2>err.log" the output on screen don't show.
The out.txt is not written immediatly (I think is buffered).
Code: Select all
C:\Users\fposc\AppData\Local\Temp>dir out.log err.log
Il volume nell'unità C è Windows
Numero di serie del volume: 0F35-6BA0
Directory di C:\Users\fposc\AppData\Local\Temp
31/03/2021 10:55 0 out.log
Directory di C:\Users\fposc\AppData\Local\Temp
31/03/2021 10:55 0 err.log
2 File 0 byte
0 Directory 15.222.960.128 byte disponibili
so i can't use in this manner.
@steffen
This is the code that already i done for simulating progress but it is not enough for me, I ask help at you..
I have see that on my machine the output of sfc is written the first time on disk after 33% of work. But i think this is not true for other pc.
Code: Select all
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: By Francesco Poscetti aka einstein1969 - for www.tenforums.com
::
:: ver. 0.2 - 27/03/2021 added percentage and remaining time on SFC part
:: ver. 0.1 - 21/03/2021
::
:: Reference:
:: https://docs.microsoft.com/en-us/troubleshoot/windows-client/deployment/analyze-sfc-program-log-file-entries
:: https://support.microsoft.com/it-it/topic/description-of-the-windows-file-protection-feature-db28f515-6512-63d1-6178-982ed2022ffb
:: https://docs.microsoft.com/it-it/windows/win32/wfp/protected-file-list
:: https://docs.microsoft.com/it-it/windows/win32/wfp/detecting-file-replacement (C++ code)
::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off & setlocal EnableDelayedExpansion & if "%1" == "Progress" goto :Progress
mode con cols=62 lines=5
cd %TMP%
(
del stop.tmp 2>nul
sfc /scannow >out.txt
type nul > stop.tmp
) | %0 Progress SFC
pause
cls
(
del stop.tmp 2>nul
DISM /online /cleanup-image /scanhealth >out.txt
type nul > stop.tmp
) | %0 Progress DISM
pause
goto :eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Progress
Title %2: Please wait...
echo %2 is running...
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
goto :Progress_%2
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Progress_DISM
for /L %%N in (0) do (
for /f "tokens=*" %%S in ('more out.txt') do (
set u=%%S
if not "x!u:[=!"=="x!u!" set v=%%S
)
if defined v (
title %2: [!v:~29,5!]
set /P "=.!CR!!v!!CR!" < nul
)
if exist stop.tmp echo(&exit
ping -n 5 127.0.0.1 >nul
)
goto :eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Progress_SFC
set "CBS.log=%windir%\Logs\CBS\CBS.log"
for /f %%L in ('FIND /V /C "" ^< %CBS.log%') do set /A LN=%%L-1
set "count_files=for /f "tokens=*" %%S in ('More %CBS.log% +!LN! ^^| findstr /c:"[SR]" ^^| findstr /C:"Verifying 100" ^^| FIND /V /C ""') do set /A v=%%S0*10"
Set "v33=#"
Set t0=%time%
for /L %%N in (0) do (
Set /A "c=(c+1)%%10"
if !c! equ 1 (
%count_files%
if not defined v33 (
for /F "tokens=1-8 delims=:.," %%a in ("!t0: =0!:!time: =0!") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, a=a/100"
Set /A "P#=v*1000/NF" & (if !P#! gtr 1000 Set "P#=1000") & Set "P=(!P#:~0,-1!.!P#:~-1!%%)"
Set /A "t=a*1000/P#, r=t-a, s=r%%60, r/=60, m=r%%60, r/=60, h=r%%60, HMS=s+m*100+h*10000+1000000" & Set "r=Time left -> !HMS:~1,2!:!HMS:~3,2!:!HMS:~5!"
title %2: !P! about !NF! files to process...
)
set /p "=.!CR!Processed !v! files... !P! !r! !CR!" <NUL
)
if defined v33 (
For %%# in ("out.txt") Do Set size=%%~z#
if !size! neq 0 (
if !c! neq 1 %count_files%
set /A "NF=(v-200)*3" & set "v33="
copy out.txt out2.txt >nul
)
)
if exist stop.tmp echo(&exit
ping -n 2 127.0.0.1 >nul
)
goto:eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Re: read sfc output
Posted: 31 Mar 2021 08:17
by Compo
There's some interesting observations made in the following
StackOverflow post, which may potentially assist you.