1

こんにちは、StackOverflow コミュニティです。

ここ数日間、私を悩ませているバッチの質問があります: スティング比較をしようとしています (単純に聞こえます) が、この方法で実行しています: SESSIONS と TARGETS の 2 つのフォルダーがあります。これらの各フォルダには、Server1.txt、Server2.txt、Server3.txt など、サーバーにちなんで名付けられた通常のテキスト ファイルがあります。両方のディレクトリには、まったく同じ名前のファイルがあります。ファイル名が重要なのは、それらを読んだ後に、そのファイルに含まれる情報をどこに割り当てるかがわかるからです。例:

セッション -->Server1.txt
Word_one
Word_two
Word_three
word_seven

TARGETS-->Server1.txt
Word_one
Word_two
Word_seven

これは、Sessions フォルダーと Targets フォルダーをトラバースするために使用しているコードです。

FOR %%a in (%ses_dir%*.txt) DO (
FOR /F "TOKENS=1 DELIMS= " %%c in (%%a) DO (
    FOR %%f in (%targ_dir%*.txt) DO (
        FOR /F "TOKENS=1 DELIMS= " %%i in (%%f) DO (
            SET tmp_nam=%%~na

            IF %%c EQU %%i ( ECHO This is Connected)
            IF %%c NEQ %%i ( ECHO This is not Connected)
        )
    )
)

)

上記は、接続されているすべてのセッションと接続されていないすべてのセッションを出力します。基本的に、これは多くの冗長で役に立たない情報を出力します。次のようにしてほしい:
最初のファイルから 2 番目のファイルの文字列を見つけるたびに、そこで停止し、最初のファイルの次の文字列に移動します。2 番目のファイルで最初のファイルの文字列が見つからない場合。「文字列が見つかりません」またはそれらの行に沿って何かをエコーし​​ます。

私はできる限り説明的であるように努めました。他にご不明な点がありましたらお知らせください。

前もって感謝します!

4

2 に答える 2

3

これは、Batch 言語の組み込みの連想配列を使用して実行できます。

@echo off &SETLOCAL
SET "sessionDir=SESSIONS"
SET "targetDir=TARGETS"

FOR %%a IN ("%sessionDir%\*.txt") DO (
    IF NOT EXIST "%targetDir%\%%~nxa" (
        ECHO "%%~nxa" NOT found IN "%targetDir%"
    ) ELSE (
        FOR /f "usebackqdelims=" %%b IN ("%%~fa") DO SET "$%%b=1"
        FOR /f "usebackqdelims=" %%b IN ("%targetDir%\%%~nxa") DO SET "#%%b=1"
        FOR /f "delims=$=" %%x IN ('set "$"') DO IF NOT DEFINED #%%x ECHO "%%x" missing IN "%targetDir%\%%~nxa"
        FOR /f "delims=#=" %%x IN ('set "#"') DO IF NOT DEFINED $%%x ECHO "%%x" missing IN "%%~fa"
    )
)

注意:Word_アイテムには=記号、先頭または末尾のスペースを含めることはできません。

于 2013-08-09T17:37:25.760 に答える
1
FOR %%a in (%ses_dir%*.txt) DO (
 FOR /F "TOKENS=1 DELIMS= " %%c in (%%a) DO (

  SET "tmp_nam="

  FOR /F "TOKENS=1 DELIMS= " %%i in (%targ_dir%%%~nxa) DO IF NOT DEFINED tmp_nam (
   IF %%c EQU %%i SET tmp_nam=%%~na
  )
  if defined tmp_nam (echo %%c connected) else (echo %%c not connected)
 )
)

これで目的が達成されるはずです。

%%a各セッションのテキストファイル名に順番に設定されます。

%%cテキストファイルの各単語に設定され、%%aクリアtmp_namされます

%%iターゲットディレクトリ内の同一のファイル名からの各単語に設定されます。

一致が見つかった場合は、tmp_nam何かに設定されます (空でなくてもかまいません) がtmp_nam定義されているため、ターゲット内の残りの単語との残りの比較はスキップされます。

一致したかどうかに応じて、一致した単語 + 「(接続されていない)」が出力されます。それがあなたのボートを浮かせる場合と同じくらい簡単に、%%aまたはその両方になる可能性があります。%%c%%a

ここで、 の単語が に一致する%%a (not) connectedかどうかを言いたい場合は、関係なく、ANY ONEsessiontargets

FOR %%a in (%ses_dir%*.txt) DO (

 SET "tmp_nam="

 FOR /F "TOKENS=1 DELIMS= " %%c in (%%a) DO (
  FOR /F "TOKENS=1 DELIMS= " %%i in (%targ_dir%%%~nxa) DO IF NOT DEFINED tmp_nam (
   IF %%c EQU %%i SET tmp_nam=%%~na
  )
 )
 if defined tmp_nam (echo %%a connected) else (echo %%a not connected)
)

これは、レポートを 1 レベル外に移動するだけです。

于 2013-08-09T17:11:44.220 に答える