4

GOTO コマンドと関連ラベルに問題があります。

事実: フォルダーから大量のファイルを受け取った場合 (それらはログ エラーです)、それらを開いて、特定の文字列が含まれているかどうかを確認する必要があります。はいの場合、ファイル名からいくつかの文字 (「_」が最後に出現した後のすべての文字を含む) をファイル名から削除し、他の操作を行います。

文字を切り取るために、ここで説明されているように、ループ方式で GOTO コマンドを使用しています: http://www.robvanderwoude.com/battech_while_loops.php

スクリプトは次のとおりです。

@echo off
setlocal EnableDelayedExpansion

cls

for %%X in (D:\e-pub\outbox\logs\*.*) do (

    for /F "tokens=7" %%S in (%%X) do (

        if /i "%%S"=="<ml>" (
            SET fisier=%%~nX
            SET cond=!fisier:~-1!
            SET fisier=!fisier:~0,-1!

            :loopStart
            rem condition to break the loop
            if !cond!==_ goto loopEnd
            SET cond=!fisier:~-1!
            SET fisier=!fisier:~0,-1!
            goto loopStart

            :loopEnd

            rem here it should be out of a loop
            rem other stuff to do with var !fisier!
            rem the following line is not executed because of the label loopEnd
            echo !fisier!
        )
    )
) 

pause

ラベル loopEnd?! の後に空の行があるため、スクリプトは実行されていません。そのラベルの直後に命令を書いている場合、命令は実行されますが、最初の for ステートメントからの残りの反復は実行されません (ログ エラー フォルダーには複数のファイルが含まれます)。

誰かが助けを提供できますか?

4

2 に答える 2

12

2 つの問題があります。

1 つの問題は、goto が for ループを壊すことです。もう一つ、ラベルはカッコ付けがかなり難しいです。

goto のラベルが同じブロック内にある場合でも、goto は常にすべてのネストされたループを中断し、for 変数はジャンプの直後に失われます。

括弧内のラベルは「2 行」指向です。ラベルを試してみましたが、ここに括弧の結果がいくつかあります。

ラベルが発生すると、次の行は「セカンダリ」行の正しい形式である必要があります。

これが失敗する理由です。

(
:this label fails with a syntax error
)

(
:this works
:because this line is a "legal" secondary line
)

(
:: The remark style
:: fails, because it's not "legal" to use a double colon, because it's not a legal path (in the most cases)
)

(
:and now I got courious & echo This will not echo'd
:but & echo You can see this !
)

2 行目では、バッチ パーサーのいくつかのステップがスキップされます。

@@echo Helloという名前のファイルを開始しようとします@echo.bat

のように、括弧の分割は失敗しますecho( hello
ラベルはファイル名として扱われ、有効なファイル名である:echoかどうかのみをチェック:echoしてから、この部分をスキップします。

::helloドライブを検索します::
テスト目的で、ドライブ::を で作成できますsubst :: c:\temp
ラベルは 2 行目で単純に無視されるため、アンパサンドとパイプも機能しますが、ファイルが::存在する必要があります。

(
echo @echo This is %~f0
) > %TEMP%\testLabel.bat

REM create Drive ::
subst :: %temp% 
(
:Label 
::\testLabel.bat The bat will not be executed | echo But this
)
subst /D ::
于 2010-10-23T20:51:56.803 に答える