1

以下のように、いくつかのソフトウェアから出力されたファイルでいっぱいのディレクトリがあります。

  • 保留中.001
  • 保留中.002
  • 保留中.003

以下のように .bat を使用して名前を変更したいと思います。

  • Pending001.csv
  • Pending002.csv
  • Pending003.csv

助言がありますか?

4

2 に答える 2

2

修飾子~n~xループ変数を使用してループ内でファイルの名前を変更し、各ファイルの名前と拡張子をそれぞれ抽出して新しい名前に連結することができます。拡張子は先頭の と一緒に抽出されるため.、拡張子を削除する前に拡張子を一時的に格納する変数も必要になります.

上記を実装する方法の例を次に示します。

@ECHO OFF
FOR %%I IN (Pending.*) DO (
  SET "ext=%%~xI"
  SETLOCAL EnableDelayedExpansion
  RENAME "%%I" "%%~nI!ext:~1!.csv"
  ENDLOCAL
)

の評価に必要なため、遅延展開が有効になっていますext。を使用する「通常の」展開は%ここでは機能しません。これは、変数がまだ空のときに、ループが開始される前に変数が一度だけ展開されるためです。対照的に、遅延展開では、変数を含む特定のコマンドが実行されるたびに、つまりループの反復ごとに変数が展開されます。

上記のバッチ ファイルは、現在のディレクトリ内のファイルを処理します。つまり、最初にファイルを処理する必要があるディレクトリに変更し、次にバッチを呼び出す必要があります。または、Windows Explorer などでこれを行う場合は、そのバッチを処理するファイルのあるディレクトリにコピーして、そこから呼び出す必要があります。

または、処理するディレクトリを指定するパラメーターを使用して呼び出すこともできます。このパラメーターを使用するには、スクリプトを次のように変更します。

@ECHO OFF
FOR %%I IN ("%~1\Pending.*") DO (
  SET "ext=%%~xI"
  SETLOCAL EnableDelayedExpansion
  RENAME "%%I" "%%~nI!ext:~1!.csv"
  ENDLOCAL
)

もちろん、ファイルが常に同じディレクトリにある場合は、ファイルへの固定パスを指定することもできます。

@ECHO OFF
FOR %%I IN ("D:\path\to\files\Pending.*") DO (
  SET "ext=%%~xI"
  SETLOCAL EnableDelayedExpansion
  RENAME "%%I" "%%~nI!ext:~1!.csv"
  ENDLOCAL
)

そうすれば、保存した場所からバッチを呼び出すことができます。

于 2012-10-20T11:44:04.307 に答える