1

2 つのテキストを検索するバッチ ファイルを作成する必要があります。変数内のテキスト行 (3 つの文字列のうち少なくとも 1 つを含み、4 つ目の文字列は含まない) とその行番号をキャプチャします。
2 番目のテキストを検索し、最初の変数の行番号に存在するテキスト行を別の変数に取り込みます。

その後も 2 行のテキスト (変数) を使用する必要があります。
私は最初のテキストの読み取りを何とか管理しましたが、2番目のテキストで何が間違っているのかわかりません:

@echo off
set "found="
for /f "tokens=1,* delims=[]" %%a in (' find /n /v "" ^< "%LocalDir%\list.txt" ') do (
    echo "%%b"|findstr /i /c:"one two small" /c:"one two birds" /c:"one two strings" >nul && set found=1
    if defined found echo "%%b"|findstr /v /c:"one two small red apples" >nul || set "found="
    if defined found (
        echo %%a found
        @echo off & setLocal EnableDelayedExpansion
        set var=%%b
        set Line_num=%%a
        endlocal
    ) else ( 
        echo %%a NOT FOUND
    )
    set "found="
)

REM part2--------------------

for /f "delims=" %%d in (list1.txt) do (
    set FullVersion=%%d
    @echo off & setLocal EnableDelayedExpansion
    for /f "tokens=1* delims=" %%e in ("%%d") do (
        if !Line_num!==%%e
        set var2=!FullVersion!
        echo !var2! 
    )
)

endlocal

echo %var%
echo %var2%

どんな助けでも大歓迎です。

これが私が解決策として最終的に得たものです:

    for /f "tokens=1,* delims=[]" %%a in (' find /n /v "" ^< "%LocalDir%\software_list.txt" ') do (

echo "%%b"|findstr /i /c:"Micro Focus Enterprise " /c:"Micro Focus Visual" /c:"Micro Focus COBOL" >nul && set found=1

if defined found echo "%%b"|findstr /v /c:"Micro Focus Enterprise Server for .NET" >nul || set "found="
 if defined found (set LineNumber=%%a&set ProductName=%%b)
REM  else (echo Main Micro Focus product NOT FOUND. Nothing to do. Exit.&exit /b)
 set "found="
)


find "2." temp1.txt > temp3.txt
for /f "tokens=2,3 delims==" %%c in (temp3.txt) do (echo %%c >> %LocalDir%\software_list1.txt)
for /f "tokens=1*delims=[]" %%a in (' find /n /v "" ^< "software_list1.txt" ') do IF %%a==%LineNumber% SET ProductVersion=%%b 

REM ECHO %LineNumber%
REM ECHO %ProductName%
REM ECHO %ProductVersion%

set ProductName=%ProductName:"=%
set ProductName=%ProductName: =%
set ProductVersion=%ProductVersion:"=%
set ProductVersion=%ProductVersion: =%




set out_file_name=%ProductName%_%ProductVersion%_%COMPUTER_NAME%
REM echo %out_file_name:"=%

みんなに感謝します。

4

3 に答える 3

1

コードにいくつかの問題があります。
このブロックは、新しい setlocal コンテキストで変数を設定し、endlocal の後で変数が失われるため、意味がありません。

    @echo off & setLocal EnableDelayedExpansion
    set var=%%b
    set Line_num=%%a
    endlocal

2 番目のブロックでは、反復ごとに setlocal コンテキストを開くと、オーバーフロー エラーが発生します。
また、Part2 の後の endlocal も矛盾しているようです。

if !Line_num!==%%eは常に構文エラーを作成します

ところで。なぜ@echo offコード内で使用するのですか? バッチ開始時の最初の 1 つで十分です。

setlocal EnableDelayedExpansionスクリプトの先頭に1 つだけ使用する必要があります。
感嘆符に問題がある場合は、DelayedExpansion トグルのみを使用してください。次のように、いくつかのエコーを使用して何が起こるかを確認できます

for /f "tokens=1* delims=" %%e in ("%%d") do (
    echo Compare: !Line_num!==%%e
    if !Line_num!==%%e set var2=!FullVersion!
    echo !var2! 
)
于 2013-06-06T07:40:30.260 に答える
0
@echo off

rem I need to create a batch file that searches through 2 text FILEs.
rem Captures a line of text in a variable (that contains at least one of 3
rem strings, but doesn't contain forth string) and its line number.

set Line_num=
for /F "tokens=1* delims=:" %%a in (
       'findstr /N /I /C:"one two small" /C:"one two birds" /C:"one two strings" "%LocalDir%\list.txt"
     ^| findstr /V /C:"one two small red apples"' ) do (

   echo %%a found
   set var=%%b
   set Line_num=%%a
)

REM part2--------------------

if defined Line_num (

   rem Searches through the second text and captures in another variable 
   rem the line of text that exists on the line-number of the first variable.

   for /F "tokens=1* delims=:" %%d in ('findstr /N "^" list1.txt') do (
      if %Line_num% == %%d (
         set var2=%%e
         echo %%e
      )
   )
)

echo %var%
echo %var2%
于 2013-06-06T11:58:39.673 に答える