0

これが私の状況です。(Windows XP では) 数百のフォルダーがあり、それぞれにいくつかの .jpg が含まれています。フォルダーの名前を変更する過程で、誤ってすべてのフォルダーを選択したときに、フォルダーの名前がす​​べて台無しになりました。

私がやろうとしているのは、各フォルダーを反復処理し、ディレクトリ内の最新ファイルの変更日を特定し、フォルダーの名前をYYYY-MM-DD形式でその日付に変更するDOSバッチスクリプトを作成することです。したがって:

Directory of C:\Work_Area\Messed_up_dir_name

07/11/2012  10:01 AM    <DIR>          
07/11/2012  10:01 AM    <DIR>          
03/10/2008  11:00 AM           176,640 image1.jpg
08/07/2007  02:27 PM            25,088 image2.jpg
04/12/2007  04:52 PM           132,608 image3.jpg
02/06/2007  06:11 PM            61,086 image4.jpg

なる"C:\Work_Area\2008-03-10\"

ここまで書いてきたのは…

@echo off   
REM ITERATE THROUGH EACH DIRECTORY
FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO ( 
    ECHO %%d
    cd %%d
    REM DETERMINE NEWEST FILE
    FOR /F %%a in ('DIR /O:-D /B') DO @ECHO %%~ta
    cd ..     
    REM echo Newest=%Newest%    
    REM move "%%f" "%Newest%"           
    pause   
)

明らかに、これを成功させるには、日付のスラッシュを別の文字に変更する必要があります。誰かがこれで私を助けることができれば、それは大歓迎です!

4

1 に答える 1

3

このスクリプトは、スクリプト (%1) の第 1 引数にルートが指定されているディレクトリ ツリーのフォルダの名前を変更します。質問に対する 2 番目のコメントで指定された要件を満たすスクリプトを作成しました。

記述されたスクリプトは、実行される名前変更コマンドを実際にエコーします。実際に名前を変更する準備ができたら、REN の前から ECHO コマンドを削除するだけです。

兄弟フォルダーに同じタイム スタンプを持つ最新の変更済みファイルがある場合、少なくとも 1 つの名前変更は失敗します。

また、スクリプトは、ファイルを含まないフォルダーの名前を変更することはできません。

@echo off
setlocal disableDelayedExpansion
if "%~1" neq "" pushd %1
for /f "eol=: delims=" %%D in ('dir /s /b /ad ^| sort /r') do call :renameFolder "%%D"
exit /b

:renameFolder
pushd %1
for /f "eol=: delims=" %%F in ('dir /b /a-d /o-d') do (
  for /f "tokens=1-4* delims=/: " %%A in ("%%~tF") do (
    popd
    echo ren %1 "%%C-%%A-%%B %%D.%%E"
    exit /b
  )
)
于 2012-07-12T15:53:06.730 に答える