concatenar cadena en bucle FOR en archivo por lotes

concatenar cadena en bucle FOR en archivo por lotes

Tengo un archivo sfsview_monitor1.txtcon el siguiente contenido:

Total pages: 16320
Pages used: 142
Pages free: 16178

Quiero el resultado como este:

16320 142 16178

con el siguiente codigo no consigo hacerlo:

@echo on 
 SETLOCAL EnableDelayedExpansion

SET myvar=
for /f "tokens=1-3" %%P in ('type c:\shafique\sfsview_monitor1.txt ^| FINDSTR /B /I "Total Pages"') do (
    SET myvar=%myvar% %%R
 )
echo %myvar%

¿Alguien me puede apuntar en la dirección correcta?

Respuesta1

En mi opinión, esto no necesariamente tiene que ser tan complicado como lo sugiere la otra respuesta.

Si esas son las únicas líneas en el archivo de texto, entonces puede usar lo siguiente:

@echo off
set var=
setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%a in (sfsview_monitor1.txt) do set var=!var!%%a
set var=!var:~1!
echo !var!
endlocal

Si las líneas están presentes en ubicaciones aleatorias en el archivo de texto, puede utilizar lo siguiente:

@echo off
set var=
setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%a in ('findstr /c:"Total pages" /c:"Pages used" /c:"Pages free" sfsview_monitor1.txt') do set var=!var!%%a
set var=!var:~1!
echo !var!
endlocal

En realidad, ni siquiera necesitas la primera versión, ya que la segunda es más genérica.


Si ni siquiera le importa almacenar los valores en una variable y simplemente está interesado en el resultado, las siguientes líneas funcionarán igual de bien:

@for /f "tokens=2 delims=:" %%a in (sfsview_monitor1.txt) do @echo | set /p var=%%a 

y

@for /f "tokens=2 delims=:" %%a in ('findstr /c:"Total pages" /c:"Pages used" /c:"Pages free" sfsview_monitor1.txt') do @echo | set /p var=%%a 

Importante:¡En ambas versiones de una línea hay un espacio al final de la línea que se requiere! Además, como se indicó anteriormente, puedes simplemente ignorar la primera versión y usar la segunda, ya que esta última es la más genérica de las dos.

Respuesta2

El valor %myvar%dentro del forbucle siempre será el valor que tenía antes de que comenzara el bucle. Si desea utilizar la variable modificada, utilice !myvar!en su lugar.

@echo on 
 SETLOCAL EnableDelayedExpansion

SET myvar=
for /f "tokens=1-3" %%P in ('type c:\shafique\sfsview_monitor1.txt ^| FINDSTR /B /I "Total Pages"') do (
    SET myvar=!myvar! %%R
 )
echo %myvar:~1%

Esto generará

16320 142 16178

La %myvar:~1%parte allí simplemente elimina el espacio que su bucle for coloca al principio del primer número.

Respuesta3

Prueba esto:

@echo off &setlocal
set "tf=%temp%%random%"
set "pt=Total pages"
set "pu=Pages used"
set "pf=Pages free"
(echo(%pt%&echo(%pu%&echo(%pf%)>"%tf%"

for /f "tokens=1,2delims=:" %%i in ('^<"sfsview_monitor1.txt" findstr /g:"%tf%"') do (
    if "%%i"=="%pt%" for /f %%a in ("%%j") do set "npt=%%a"
    if "%%i"=="%pu%" for /f %%a in ("%%j") do set "npu=%%a"
    if "%%i"=="%pf%" for /f %%a in ("%%j") do set "npf=%%a"
)
del "%tf%"
SET "myvar=%npt% %npu% %npf%"
echo(%myvar%

información relacionada