0

ディレクトリから始めて、次のことをしたいと思います。

  1. 各サブフォルダーを再帰的に覗く
  2. ファイルのリストを特定する
  3. それらのファイルに変更を適用する
  4. 開始点に戻り、残りのディレクトリで 1 ~ 3 をやり直します。

これは、DOSバッチファイルを介してそれを行う私の試みです:

 for /r . %%g in (*.pm) do (
  SET FILEPATH=??
  SET FILENAME=??
  SET CURRENT="%cd%"
  cd %FILEPATH%
  perl Perl_Script.pl %FILENAME%
  cd "%CURRENT"
   )

FILEPATH と FILENAME を何に設定する必要がありますか?

Jakub からの回答に基づいて、プログラムを次のように変更しました。

 for /r . %%g in (*.pm) do (
  SET FILEPATH="%%~pg"
  SET FILENAME="%%~g"
  SET CURRENT="%cd%"
  cd %FILEPATH%
  perl Perl_Script.pl %FILENAME%
  cd %CURRENT%
   )

FILENAME と FILEPATH が正しい値を受け取っていることをログから確認できましたが、同様に計り知れない理由で、%FILEPATH% と %FILENAME% は常に、これらの変数に最初に割り当てられた値に設定されていました。

数時間グーグルで調べた後、この遅延拡張の概念があることに気付きました。最終的に(そして厳しい決闘の後)、最終的には次のようになりました。

 setlocal enabledelayedexpansion
 for /r . %%g in (*.pm) do (
  SET FILEPATH="%%~pg"
  SET FILENAME="%%~g"
  SET CURRENT="%cd%"
  cd !FILEPATH!
  perl Perl_Script.pl !FILENAME!
  cd %CURRENT%
   )
 endlocal

魅力のように動作します!!!

4

1 に答える 1

1

これは、ファイル名を個別のファイル情報に分割する方法を詳述した回答です。あなたの場合、%%~ng名前と%%~pgパスが必要です。

于 2012-10-13T13:41:10.527 に答える