1

私はこのコードを持っています

@Echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
SET T=
For /F %%i In (qqq.txt) Do (  
  set fg=%%i 
  FOR /L %%G IN (2, 1, %DirCount%) DO (call :subroutine "%%i") 
)

:subroutine 
Set T=!T!../ 
start /wait %mydir%program.exe %T%%fg% 
echo %t%%fg%  >>%cd%see.log

qqq.txtには行があります

1
2
3

結果として私は得る:

../1
../../2
../../../3
../../../../3

しかし、私はこのようにする必要があります:

../1
../../1
../2
../../2
../3
../../3

私が間違っていることを助けてください?


ほんの少し追加が必要

私は最初に起こるものが必要です

set "T=!T!../"
will be without dots
set "T=!T!/"
result must be
/1
../1
../../1
/2
../2
../../2

カウンターを追加し、ループごとに表示する方法と場所

echo Now looping: %%i row of %countrow(in qqq.txt), left %countrow-%%I
echo Now looping: Dir Nr%%G !T!%%i

愚かな質問で申し訳ありませんが、バッチコーディングは私には難しいです。

4

1 に答える 1

3

あなたには3つの問題があります:

1)メインループの後でプログラムを終了しないため、プログラムはサブルーチンに分類されます。

2)FOR / L IN()句が間違っています。最初の数値は2ではなく1である必要があります

3)外側のループ内でTを未定義にリセットする必要があります。

編集
私はあなたが追加の問題を抱えているかもしれないと信じています。出力をリダイレクトするときは、ファイル名の前に。を付けます%cd%。私はそれがあなたが望む結果を与えているとは思わない。現在のディレクトリがの場合C:\test、ルート>>%cd%see.log指定されたファイルに出力が送信されます。現在のディレクトリに出力が必要な場合は、である必要がありますが、デフォルトでは現在のディレクトリを使用するため、パス情報は実際には必要ありません。だから本当にあなたが必要とするのは。私はあなたの意図がわからないので、最初に書かれたようにリダイレクトを残しました。編集終了testsee.logC:\>>%cd%\see.log>>see.log

@echo Off
SetLocal EnableDelayedExpansion
SET mydir=D:\
SET DirCount=2
For /F %%i In (qqq.txt) Do (
  SET T=
  set fg=%%i
  FOR /L %%G IN (1, 1, %DirCount%) DO (call :subroutine "%%i")
)
exit /b

:subroutine
Set T=!T!../
start /wait %mydir%program.exe %T%%fg%
echo %t%%fg%  >>%cd%see.log

特に遅延拡張をすでに有効にしているため、この場合はサブルーチンを呼び出す必要はありません。以下は、より少ないコードで同じ結果をもたらし、比較的遅いCALLステートメントを回避するためより高速です。(この小さな例では、パフォーマンスはおそらく問題ではありませんが、反復回数が多いループを使用すると、大きな違いが生じる可能性があります)

@echo Off
SetLocal EnableDelayedExpansion
SET mydir=D:\
SET DirCount=2
For /F %%i In (qqq.txt) Do (
  SET "T="
  FOR /L %%G IN (1, 1, %DirCount%) DO (
    set "T=!T!../"
    start /wait %mydir%program.exe !T!%%i
    echo !T!%%i  >>%cd%see.log
  )
)


追加の質問に対する部分的な回答

FOR / Fを使用して、FIND / Cの結果をキャプチャし、「qqq.txt」の行数を取得できます。これは、メインループに入る前に行う必要があります。

for /f %%N in ('find /c /v "" ^<qqq.txt') do set "rowCount=%%N"

SET / Aを使用して基本的な計算を行うことができるため、残りの行数を追跡できます。

メインループに入る前に、まず残りのカウントを初期化します。

set "remainingLines=%rowCount%"

次に、メインループ内でSET/Aを使用して値をデクリメントします。

set /a remainingLines-=1
于 2012-07-25T20:03:56.947 に答える