string de concatenação no loop FOR no arquivo de lote

1

Eu tenho um arquivo sfsview_monitor1.txt com o seguinte conteúdo:

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

Eu quero a saída assim:

16320 142 16178

com o seguinte código, não consigo:

@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%

alguém pode me apontar na direção certa?

    
por shaf 08.05.2013 / 11:53

3 respostas

4

IMO isso não necessariamente tem que ser tão complicado quanto a outra resposta faz parecer.

Se essas forem as únicas linhas no arquivo de texto, você poderá usar o seguinte:

@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

Se as linhas estiverem presentes em locais aleatórios no arquivo de texto, você poderá usar o seguinte:

@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

Você nem precisa da primeira versão, pois a segunda é mais genérica.

Se você nem se importa em armazenar os valores em uma variável e simplesmente está interessado na saída, os seguintes liners farão o mesmo:

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

e

@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: Em ambas as versões de uma linha há um espaço no final da linha que é necessário! Além disso, como mencionado acima, você pode simplesmente ignorar a primeira versão e usar a segunda, já que esta é a mais genérica das duas.

    
por 10.05.2013 / 18:36
0

Tente isto:

@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%
    
por 08.05.2013 / 13:22
0

O valor de %myvar% dentro do loop for sempre será o valor que estava antes do loop começar. Se você quiser usar a variável modificada, use !myvar! .

@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%

Isto irá produzir

16320 142 16178

A parte %myvar:~1% lá simplesmente remove o espaço que seu loop for coloca no começo do primeiro número.

    
por 20.07.2015 / 17:43