2016-06-17 4 views
0

実際のニーズに合わせてより複雑なバージョンのスクリプトを作成できるように、テストコードを取得しようとしていますが、FINDコマンドでは苦労しています。FINDコマンドのバッチ問題

マイコード:

@echo off 
SETLOCAL DISABLEDELAYEDEXPANSION 

>"%~dpn1_b.txt" (
    FOR /F "tokens=1* delims=]" %%j in ('find /V /N "" %1') DO (
    SET "currentLine=%%k" 
    SETLOCAL ENABLEDELAYEDEXPANSION 
    IF "!currentLine:~0,3!"=="12/" (
     SET string=!currentLine:~0,2!!currentLine:~3,4! 
     FIND "%string%" 111.txt > nul 
     IF %errorlevel% EQU 0 (SET "currentLine=!currentLine:~0,2!!currentLine:~3!") 
    ) 
    ECHO(!currentline! 
    ENDLOCAL 
) 
) 

これは、バッチファイルにtest.txtというドラッグすることによって実行されます。

111.txtは123456を保持します。test.txtは、1行目が12/3456、2行目が12/4456です。スクリプトは最初の行からスラッシュを削除するが、2番目の行から削除するはずではない。どのようなアイデアが間違っていた?

+0

一般ヒント:デバッグ時にファイルの先頭から '@echo off'を削除します。 –

+0

私はスクリプトが何かを中止しないということを忘れています。両方のスラッシュを削除します。 –

答えて

1

FORループ本体内では、%var%形式を使用するすべての環境変数展開が事前展開されます。 errorlevelのような内部変数に対しても、遅延拡張!var!形式を使用する必要があります。

FOR /F ... (
    ... 
    FIND "!string!" 111.txt > nul 
    IF !errorlevel! EQU 0 (SET "currentLine=!currentLine:~0,2!!currentLine:~3!") 
) 

ライアンが述べたように、あなたは、元のコードでループの最後の2つのステートメントは、予備発泡されていたことがわかりとしてECHOが有効なままにしておくと、これは明確である:

FIND「」111 .TXT 1> NUL

0 EQU 0(SET "currentLine = currentLine!:〜0,2 !! currentLine:〜3!")IF

0

興味深い:あなたは行番号を取得する(%%j)が、その後

どのようにして...それを使用しないでください:

... 
if "%%j"=="[1" (
    ... 
) else (
    echo %%k 
) 
... 
+0

いいえ - あなたはポイントを見逃しました。 - FINDまたはFINDSTRを使用して行番号を挿入し、その後に区切り文字を挿入するのは、FOR/Fを使用するときに空行を保存するための標準的な手法です。 '%% j 'の値は、テキスト内の特定の行を操作しない限り、意図的に無視されます。 OPは、どの行にテキストがあるかを知らない。 – dbenham

+0

@dbenham_ "最初の行からスラッシュを削除しますが、2番目の行からは削除しません。" – Stephan

+0

ああ - 私はあなたの混乱の源を見ます。私はOPがこの特定のケースで*最初の行だけを修正する必要があることを意味する陳述を意図していると信じています。しかし、行番号はインスタンスごとに変更される可能性があります。すべての行の構築された文字列が111.txt内にあるかどうかによって異なります。 – dbenham