-1

各行にファイル名を含むファイルを通過するループを作成し、最初のファイル名を変数として設定し、スクリプトの場合は残りを実行しようとしています。次に、2 行目を取り、同じことを行います。などなど。問題は、 filenames.txt の最初の行のみを実行することです

@echo off

for /F "tokens=*" %%G in (filenames.txt) do (
set filename=%%G
script
script
script
)
pause

バッチファイルになっています。スクリプト全体:

@ECHO OFF
for /F "tokens=*" %%G in (filenames.txt) do (
SET FileName=%%G
SET Word1="ts_confirmImplicitSAMM.gram"
SET Word2="SWIrcnd"
for /f "tokens=3" %%f in ('find /c /i %Word1% %FileName%') do set PairsToShow=%%f
SET /a Lines1=0, Lines2=0
FOR /f "delims=" %%a IN ('findstr "%Word1%" "%FileName%"') DO (
SET "str=%%a"
SET /a Lines1+=1
SETLOCAL enabledelayedexpansion
SET "$1!Lines1!=!str!"
FOR /f "tokens=1*delims==" %%b IN ('set "$1"') DO (IF "!"=="" endlocal)&SET "%%b=%%c"
)
FOR /f "delims=" %%a IN ('findstr "%Word2%" "%FileName%"') DO (
SET "str=%%a"
SET /a Lines2+=1
SETLOCAL enabledelayedexpansion
SET "$2!Lines2!=!str!"
FOR /f "tokens=1*delims==" %%b IN ('set "$2"') DO (IF "!"=="" endlocal)&SET "%%b=%%c"
)
SET /a Lines=Lines1+Lines2
ECHO(%Lines% lines read from %FileName%.
IF %Lines1% leq %Lines2% (SET /a MaxPairs=Lines1) ELSE SET /a MaxPairs=Lines2
IF %PairsToShow% gtr %MaxPairs% (
ECHO only text for %MaxPairs% pairs NOT %PairsToShow% :/
GOTO :END
)
(FOR /l %%a IN (1,1,%PairsToShow%) DO (
SETLOCAL ENABLEDELAYEDEXPANSION
CALL SET "Line1=%%$1%%a%%"
CALL SET "Line2=%%$2%%a%%"
<NUL SET /p "=!Line1!"
ECHO !Line2!
ENDLOCAL
))>> result1.txt
ENDLOCAL
TYPE result1.txt| FINDSTR /V EVNT=SWIgrld >> result.txt
DEL result1.txt

PAUSE
)
4

1 に答える 1

0

スクリプトの残りの部分を表示せずに...おそらく次の 2 つのうちの 1 つを実行する必要があります。

  1. SETLOCAL ENABLEDELAYEDEXPANSION を (スクリプトの 2 行目として) 使用し、変数ファイル名を !filename! として参照します。%filename% の代わりに、ロード時の値の代わりに実行時の値を使用します。ただし、「スクリプト」で何が行われるかによっては、他の問題が発生する可能性があります。
  2. ファイル名の代わりに %%G を使用してください
于 2013-07-18T13:29:09.053 に答える