1

for結果のループを使用しようとしていfindstrます。var6を見つかった文字列の上にあるWHOLE行にしたいClass=!var4!。私は入れましskip=-1たが、それは機能しません(1行後ろを振り返る)。

したがって、次のようになります。

Name=Bismark #14
Class=var4

var6 = Name = Bismarck#14が欲しいのですが

findstr /b "Class=!var4!" "PosTime_Campaign_SCR.mis"
if not errorlevel 1 (
for /f "skip=-1 delims=" %%L in ('findstr "Class=!var4!" PosTime_Campaign_SCR.mis') do (
if not errorlevel 1 (
set var6=!var6!%%L
)
)
)

私は近くにいますがfor、見つかった。の文字列の1行上を表示するようにループに指示する方法がわかりませんfindstr

解決:

@echo off

set var4=BBBismarck

for /f "delims=" %%L in (PosTime_Campaign_SCR.mis) do (
if /i "%%L" equ "Class=%var4%" (
    goto endloop
)
set "var6=%%L"
)
    :endloop

echo %var6%
pause
4

2 に答える 2

2

findstrその仕事 に使うのは難しいでしょう。

1つのアプローチがわかります。/Nオプションfindstrを使用して行番号を書き出し、その行番号を別のループで使用して、ファイルの一度に1行を処理var6し、前の行に設定します。

findstrただし、とにかくファイル内のすべての行をループしている場合は、完全にスキップして、独自の比較を行う方がよい場合があります。またはfindstr各行で使用します。

これが私が想像していることを説明するための完全にテストされていないコードです:

for /f %%L in (PosTime_Campaign_SCR.mis) do (
    if /i "%%L" equ "Class=%var4%" (
        goto endloop
    )
    set "var6=%%L"
)
:endloop

echo %var6%

ここで行っているのはvar6各行に設定することですが、必要な行に到達したら、ループからスキップします。したがってvar6、前の行の値に設定されることになります。

于 2013-03-21T19:40:46.003 に答える
0
(set var6=)
for /f "delims=" %%L in (PosTime_Campaign_SCR.mis) do IF NOT DEFINED var6 (
echo %%L | findstr "Class=!var4!" >nul
if not errorlevel 1 (set var6=!lastline!)
set lastline=%%L
)

... Class=var4がファイルの最初の行に表示されないと仮定します。

lastline最後に読み取った行の内容を保持します。FINDSTRが一致する行を検出すると、var6は前に読み取った行の内容に設定され、var6は環境に設定されているため、チェックは繰り返されず、var6は最初の一致する行の前の行の内容に設定されます。 。

削除するとIF NOT DEFINED var6、var6は最後に一致する行の前の行の内容に設定されます。

実行後にvar6が未定義の場合、一致する行はありませんでした。

于 2013-03-21T19:42:25.217 に答える