1

初めての DOS スクリプトの 1 つを作成しようとしています (bash に慣れています)。

連番と年をプレフィックスとして使用して、写真の名前を変更するスクリプトを作成しようとしています。このスクリプトを作成しました:

@ECHO OFF
setlocal EnableDelayedExpansion

echo.
SET /P Year=Please enter Year (YYYY) : 
SET /P Start=Starting Number          : 

dir     

set /A i=%Start%
for %%f in (*.JPG) do call :renameit "%%f"
goto done

:renameit

echo %1 %i%
set str=%i%
set str=0000!str:.=!
set str=!str:~-4!  
ren %1 PICT_%Year%_%str%.JPG
set /A i+=1

:done

問題は、それがうまく動作することもあれば、すでに名前が変更されたファイルの名前を変更するためにもう一度追加の検索を行うこともあります。以下に 2 つの例を示します (ご覧のとおり、トラブルシューティングのために上記のスクリプトに DIR と ECHO を追加しました)。

実行 1 (正しい) :

Directory of C:\TEST

07/01/2013  10:55    <DIR>          .
07/01/2013  10:55    <DIR>          ..
04/08/2011  14:28            16.823 PICT_2012_0005.JPG
04/08/2011  14:28            16.823 PICT_2012_0006.JPG
04/08/2011  14:28            16.823 PICT_2012_0007.JPG
07/01/2013  10:56               368 script.cmd
           4 File(s)         50.837 bytes
           2 Dir(s)  30.342.901.760 bytes free
"PICT_2012_0005.JPG" 5
"PICT_2012_0006.JPG" 6
"PICT_2012_0007.JPG" 7

実行 2 (失敗) :

Directory of C:\TEST

07/01/2013  10:56    <DIR>          .
07/01/2013  10:56    <DIR>          ..
04/08/2011  14:28            16.823 PICT_2011_0005.JPG
04/08/2011  14:28            16.823 PICT_2011_0006.JPG
04/08/2011  14:28            16.823 PICT_2011_0007.JPG
07/01/2013  10:56               368 script.cmd
           4 File(s)         50.837 bytes
           2 Dir(s)  30.342.901.760 bytes free
"PICT_2011_0005.JPG" 5
"PICT_2011_0006.JPG" 6
"PICT_2011_0007.JPG" 7
"PICT_2012_0005.JPG" 8

私が間違っていることは何ですか?

ありがとう

4

1 に答える 1

3

コメントを完全な回答に拡張しました。

これは、コマンドの既知の機能/問題/未定義の動作です。forファイルのディレクトリをループしてそれらのファイルを変更する場合、for ループはフォルダー内のファイルの静的リストを保持しません。代わりに、ファイル システムから何も返されなくなるまで、次のファイルをチェックします。ただし、ループ内でファイルを変更すると、ファイル システムはその変更を追加のファイルと見なし、再び for ループに送信されます。これにより、(for ループとファイル システムの競合状態に基づいて) 不明な数のファイルが再処理されます。

それについての詳細な議論については、このフォーラムを参照してください。

http://www.dostips.com/forum/viewtopic.php?f=3&t=4138&sid=463cb91964f497c478afcca79c33384a

代わりに、これをステートメントに使用できます。for /F "delims=" %%F in ('dir /B *.jpg') do call :renameit "%%~fF"

このdirコマンドは、実行時にディレクトリ内のファイルの静的リストを生成し、ファイルの再帰を防ぎます。

于 2013-01-07T15:23:32.000 に答える