3

デジタルカメラのビデオ録画からのファイルの名前変更に取り組んでいます。それらは、情報を必要としない一般的な増分ファイル名でファイルを出力します。私のフォルダ構造は次のとおりx:\processing\01020304\VIDEO\0001.aviです。

私が達成しようとしているファイル名は、この例では次のようになります。

01-02-20121227-07h30m00s-03-04.avi

この例では、フォルダ01-02の最初の 4 つの番号です。ビデオが作成された日付であり、ビデオの終了時間であり、通常は「最終更新時間」によって報告されます。最後に、以前に使用されたフォルダー名の後半です。010203042012122707h30m00s03-04

私はこのようなバッチ ファイルを作成するのはまったくの初心者ですが、自分で始めるのに十分な類似の例を他に見つけることができなかったので、助けていただければ幸いです。

編集:これまでのところ、私は持っています:

    @echo off
setlocal EnableExtensions EnableDelayedExpansion

:: Setup
set "xPath=c:\processing\01010101\VIDEO"
set "xFolder="
set "xDateCreated="

:: 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:W /4') do if exist "%%~fE" (
    set "xDateCreated=%%~A %%~B %%~C"
    echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateCreated:~6,4!!xDateCreated:~0,2!!

xDateCreated:~3,2!-!xDateCreated:~11,2!h-!xDateCreated:~14,2!m-00s-%xFolder:~4,2%-%

xFolder:~6,2%%%~xE
)
popd

endlocal
pause

私たちはほとんどそこにいます.秒が足りないだけです.可能であればIDを変更したいので、ディレクトリを指定する必要はありません.

4

1 に答える 1

3

更新された回答

@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:CT: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解析を追加し、変数を追加しました。これで完全に機能するはずです。後で時間があれば、もう少しクリーンアップします。robocopyxDateGMT

編集3:

回答を再フォーマットして、よりクリーンにしました。上記の更新セクションを参照してください。

于 2012-12-27T17:09:55.790 に答える