-2

この findstr コマンドの下の 2 行目にあるvar5を取得するために、行をスキップしようとしています。

'findstr /x /v /c:"Ship sunk" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.clg" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.cfg"')

繰り返しますが、findstr (上記) がその文字列を見つけた場所の下の 2 行目からvar5を取得したいと思います。

そこで、for ループでスキップ用の変数を作成することにしました。私はそれを「skipnumber5」と呼びました。ただし、この変数を使用すると、私が言う行の量をスキップしますが、ループは繰り返されません。したがって、skipnumber5=12 を設定すると、「skip=12」と同じように動作しません。最初のループは正しく実行されますが、最初のループ結果が何度も繰り返されます。skip=12 を使用すると、ループで正しく機能しますが、var5が変更されたときにそれを取得するには、skip 値を変更する必要があります。

コード: set /a skipnumber5=0

:part5
set /a skipnumber5+=12
set /a maxlines5+=1
set /a linecount5=0

for /F "delims=" %%x in ('findstr /c:"Ship sunk" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\*.clg" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\Log_*.cfg"') do (
set /a linecount5+=1
set FileName5=
set FileName5=%%~nx
if !linecount5! GEQ %maxlines5% goto part5a 
)

:part5a
set /a maxlines5a+=1
set /a linecount5a=0
for /f "skip=%skipnumber5% tokens=2 delims==" %%E in ('findstr /x /v /c:"Ship sunk" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.clg" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR2\!FileName5!.cfg"') do (
set /a linecount5a+=1
set var5=
set var5=!var5!%%E
set /a skipnumber5+=12
if !linecount5a! GEQ %maxlines5a% (goto part5b)
)

for ループ オプションで、変数skipnumber5を含む問題の行は次のとおりです。

 for /f "skip=%skipnumber5% tokens=2 delims==" %%E in

問題は、変数skipnumber5のスキップが同じファイルにとどまり、スキップしていることです。しかし、コードを読むと、スキップして次のFilename5に変更されるはずです。これが、skip=1 または任意の整数の場合の動作です。

では、変数skipnumber5が skip= をこのように動作させるのはなぜでしょうか?

4

1 に答える 1

0

遅延拡張なしのfindstrを使用した1つの例:

@echo off &setlocal
set "search=mysearch"
set "file=file.txt"

:: find first %search%
set "count="
for /f "tokens=1*delims=:" %%i in ('findstr /n "%search%" %file%') do if not defined count set /a count=%%i
echo pattern:  [%search%] found at line %count%
:: two lines down --> skip+1
set /a count+=1
set "variable="
set "found="
:: grab line+2
for /f "skip=%count%tokens=1*delims=:" %%i in ('findstr /n "^" %file%') do if not defined found set "found=%%i"&set "variable=%%j"
:: Note: you need %found% to find empty lines
echo variable: [%variable%] found at line %found%
endlocal

あなたの質問に: !variable! は使用できません。for parameterまたは、同じコード ブロック内の値を変更するコード ブロック内のfor ループ変数(delims、skip など)。

于 2013-03-22T21:37:07.217 に答える