0

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

for /f "tokens=*" %%p in (input.txt) do (
echo %%p
cd %%p
set /a c = 0
for %%f in (*) do (
echo %%f
if not exist *test*.* (
set /a c += 1
)
)
if %%c GTR 0 echo %%p >>folders.txt
cd ..
)

しかし、最後のifステートメントは機能していません。最初に設定した変数cにアクセスするには、何をする必要があるのか​​知りたいです。!c!のようなさまざまな組み合わせを試しました。または%c%ですが、何も機能していないようです。私は何が欠けていますか?

4

1 に答える 1

1

ここでいくつかの問題があります:

  1. =の周りにスペースがあってはなりませんset

    set c=0
    set /a c+=1
    

    それ以外の場合は、名前がスペースで終わる変数を作成しています。

  2. ブロックに変数を設定し、遅延拡張を使用せずに同じブロックでそれらを再度使用することはできません。だからあなたは必要です

    setlocal enabledelayedexpansion
    

    バッチファイルの先頭で、!c!代わりに使用します(フォームの変数はループ変数であり、設定した環境変数ではない%%cため、それ自体はすでに間違っていますが、ループ変数であるため正しいです)。%%xforset%%pfor

    ステートメントが実行される直前ではなく、ステートメントが解析さcmdれるとすぐに変数を値に拡張するため、遅延拡張が必要です。そして、ループのブロック全体は、関係する限り単一のステートメントであるため、ループが実行されると、環境変数はすでにそれらの値に展開されます。forcmd

だからあなたはで終わるでしょう

setlocal enabledelayedexpansion
for /f "tokens=*" %%p in (input.txt) do (
  echo %%p
  pushd %%p
  set /a c=0
  for %%f in (*) do (
    echo %%f
    if not exist *test*.* (
      set /a c+=1
    )
  )
  if !c! GTR 0 echo %%p >>folders.txt
  popd
)

(私はまた、ディレクトリを変更する代わりにpushd/を使用しました。これは少し良いです。)popdcd

于 2012-07-31T12:02:54.390 に答える