0

私の目標は、特定のフォルダーに移動してタスクを実行し、そのタスクが完了したら別のフォルダーに移動して繰り返すことができるようにすることです。

@echo off
setlocal ENABLEDELAYEDEXPANSION
set vidx=0
for /F "tokens=*" %%A in (z:\desktop\cookieclean\test.txt) do (
    SET /A vidx=!vidx! + 1
    set var!vidx!=%%A
)
set var

echo %var!vidx!%

set /a vidx+=1

echo %var!vidx!%

endlocal

それが私が取り組んでいるコードです。Web 上の別の場所からコードをコピーして、自分のやりたいことを実行させようとしました。上記のコードは、変数として 3 行のテキストを挿入し、それをインクリメントするテスト ファイルを取得しようとしているだけです。

とても単純なことだと思いますが、これを何時間も機能させようとしてきましたが、新人らしさが現れています。

私がやろうとしていることの疑似コードは

Input variables from text

Open folder containing files

Delete files that are older than X days

Move active folder to next folder in directory

Delete files that are older than X days

Loop

End

コマンドラインを使用しようとしています。

4

1 に答える 1

0

遅延拡張と通常拡張が逆になっています。外側の変数の前に内側の変数を展開する必要があります。!var%vidx%!

ループ内の SET /A ステートメントは機能しますが、変数を展開する必要はありません。これは同様に機能します: SET /A vidx=vidx + 1、またはさらに良い:SET /A vidx+=1

また、結果を表示するロジックが正しくないと思います。以下のコードは機能するはずです。

@echo off
setlocal enableDelayedExpansion
set "vidx=0"
for /f "tokens=*" %%A in (z:\desktop\cookieclean\test.txt) do (
  set /a vidx+=1
  set "var!vidx!=%%A"
)
set var

set "cnt=vidx"
set "vidx=1"
:loop
if %vidx% leq %cnt% (
  echo !var%vidx%!
  set /a vidx+=1
  goto :loop
)

endlocal

これは、GOTO ループの代わりに FOR /L を使用する、はるかに単純で効率的な方法です。

@echo off
setlocal enableDelayedExpansion
set "vidx=0"
for /f "tokens=*" %%A in (z:\desktop\cookieclean\test.txt) do (
  set /a vidx+=1
  set "var!vidx!=%%A"
)
set var

for /l %%N in (1 1 %vidx%) do echo !var%%N!

endlocal
于 2013-01-28T23:02:03.203 に答える