バッチファイル内のFORループで文字列を連結する

バッチファイル内のFORループで文字列を連結する

sfsview_monitor1.txt次の内容のファイルがあります:

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

次のような出力が欲しいです:

16320 142 16178

次のコードでは実行できません:

@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

私の意見では、これは必ずしも他の回答ほど複雑である必要はありません。

テキスト ファイル内にこれらの行しかない場合は、次のコードを使用できます。

@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

行がテキスト ファイル内のランダムな場所に存在する場合は、次のように使用できます。

@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

2 番目のバージョンの方が汎用性が高いため、実際には最初のバージョンは必要ありません。


変数に値を格納する必要がなく、出力だけに興味がある場合は、次のワンライナーでも十分です。

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

そして

@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 

重要:これら 1 行バージョンの両方で、行末にスペースが必要です。また、上記のように、2 つ目のバージョンの方がより汎用的であるため、最初のバージョンを無視して 2 つ目のバージョンを使用することもできます。

答え2

%myvar%ループ内のの値はfor常にループ開始前の値になります。変更された変数を使用する場合は、!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%

出力は次のようになります

16320 142 16178

そこの部分%myvar:~1%は、for ループが最初の数字の先頭に配置するスペースを単に削除するだけです。

答え3

これを試して:

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

関連情報