更新された回答
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:: Create Empty Folder
rd /Q "%Temp%\Temp" 2>nul & mkdir "%Temp%\Temp"
:: Loop through Folders
pushd "xPath=x:\processing"
for /d %%D in (*) do call :Process "%%~fD"
popd
goto End
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Process <Parent>
:: Folder Name
set "xFolder=%~nx1"
:: Set Sub Folder
if not exist "%~1\VIDEO\" goto :eof
pushd "%~1\VIDEO"
:: Loop through Videos
for /f "delims=" %%A in ('dir *.avi /b') do if exist "%%~fA" (
set "xDateWritten=%%~tA"
set "xDateGMT=0000/00/00 00:00:00"
for /f "tokens=1,2" %%X in ('robocopy . "%Temp%\Temp" "%%~nxA" /TS /FP /NS /NC /NP /NJH /NJS /NDL /L') do set "xDateGMT=%%X %%Y"
rem Format = FF-FF-YYYYMMDD-HHh-MMm-SSs-FF-FF.ext
echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA
)
popd
goto :eof
:End
endlocal
pause
をに変更したのでT:C
、T:W
最終書き込み日のみを使用するようにスクリプトを調整し、フォルダーの再帰を追加しました。
echo
準備ができたら、行を次のように置き換えます。
ren "%%~fA" "%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"
オリジナル&エディット
スクリプトをシンプルに保つために、投稿したフォルダー構造に厳密に基づいてフォーマットを設定しています。これは、開始するための単なるスケルトン スクリプトです。動作しますが、ビデオの長さは得られません。長さは既に取得した情報に基づいて計算できますが、今は日付計算を行う気がしませんでした。:)
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:: Setup
rd /Q "%Temp%\Temp" & mkdir "%Temp%\Temp" 2>nul
set "xPath=x:\processing\01020304\VIDEO"
set "xFolder="
:: Parse Folder Name
for /f "tokens=3 delims=\" %%A in ("%xPath%") do set "xFolder=%%A"
:: Loop through Videos
pushd %xPath%
for /f "tokens=1,2,3,4,*" %%A in ('dir *.avi /T:C /4') do if exist "%%~fE" (
set "xDateWritten=%%~tE"
set "xDateCreated=%%~A %%~B %%~C"
set "xDateGMT=0000000000000000000"
for /f "tokens=1,2" %%X in ('robocopy . "%Temp%\Temp" "%%~E" /TS /FP /NS /NC /NP /NJH /NJS /NDL /L') do set "xDateGMT=%%X %%Y"
echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateCreated:~6,4!!xDateCreated:~0,2!!xDateCreated:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xE
)
popd
endlocal
pause
残念ながら、このt
オプションとdir
コマンドは、秒単位で必要な日付の解決を提供しません。ファイルの完全な最終変更タイム スタンプを取得するには、forfiles
またはrobocopy
コマンドを使用できます。
rd /Q "%Temp%\Temp" 2>nul & mkdir "%Temp%\Temp" && robocopy . "%Temp%\Temp" *.avi /TS /FP /NS /NC /NP /NJH /NJS /NDL /L
注: RoboCopy はファイルのタイム スタンプを GMT+0 で返します。ユーザーのタイムゾーン設定に基づくタイムスタンプは返しません。現在のタイムゾーンを確認するには、 を使用しますtzutil /g
。
RoboCopy /?
(Vista+ または XP リソース キット)を参照してください。
forfiles /M *.avi /C "cmd /c echo @ftime"
ForFile /?
(Vista+)を見る
編集:
最後に書き込まれた時間と分をファイル名に含めるようにコードを更新しました。実行する必要があるのはrename
、ループにコマンドを追加することだけです。ファイルからタイム スタンプの秒を取得するには、robocopy
またはforfiles
コマンドを使用する必要があります。
編集 2:
RoboCopy と GMT+0 ファイルのタイム スタンプに関するメモを追加し、この制限に対応するようにコードを更新しました。rd
とを追加しmkdir
て、空のフォルダーがあることを確認し、ファイルのタイムスタンプのfor
解析を追加し、変数を追加しました。これで完全に機能するはずです。後で時間があれば、もう少しクリーンアップします。robocopy
xDateGMT
編集3:
回答を再フォーマットして、よりクリーンにしました。上記の更新セクションを参照してください。