ダウンロードフォルダの自動整理

ダウンロードフォルダの自動整理

目次

はじめに
やりたいこと
バッチ作成
実行してみる
終わりに

はじめに

私は普段、仕事でファイルをダウンロードする際、深く考えずにとりあえずダウンロードフォルダに保存してしまうことがよくあります。しかし、数週間後にそのファイルが必要になったとき、どれが目的のファイルなのか見つけられなくなってしまうことがしばしばあります。
そこで今回は、ダウンロードしたファイルを自動で毎日その日ごとのフォルダに振り分けるバッチファイルを作成して、効率的にファイルを管理する方法を紹介したいと思います。

やりたいこと

1. バッチ実行
2. ファイルごとの日付を取得
3. 対象の日付のフォルダを作成
4. ファイルを対象の日付フォルダに移動

バッチ作成

上記を踏まえて、下記のコードを作成してみました。

@echo off

ダウンロードフォルダのパスを設定
set "download_dir=%USERPROFILE%\Downloads"

ダウンロードフォルダ内のファイルを処理
for %%f in("%download_dir%\*") do(
	set year=%%c
	set month=%%a
	set day=%%b
	set folder_name=!year!-!month!-!day!
	)

	フォルダが存在しない場合は作成
	if not exist "%download_dir%\!folder_name!\"(
		mkdir "%download_dir%\!folder_name!"
	)
	
	ファイルを該当の日付フォルダへ移動
	move "%%f" "%download_dir%\!folder_name!\"
)

echo ファイルの整理が完了しました。
pause
<簡単に重要な部分の解説>

まず、下記コードでダウンロードフォルダパスの設定を行います。

set "download_dir=%USERPROFILE%\Downloads"

%USERPROFILE%はWindowsの環境変数で各ユーザーのホームディレクトリを指します。これにより、このスクリプトはほかのPCでも動作するようになります。

次にファイルごとの整理を行います。
まず、forループを使ってダウンロードフォルダ配下のすべてのファイルを取得します。%%fにファイル名が格納され、こちらを使用して各ファイルに対して処理を行います。

for %%f in("%download_dir%*") do(...)

ファイルの移動先がない場合に、フォルダを自動作成します。
Mkdirコマンドでフォルダの作成先を指定します。

if not exist "%download_dir%!folder_name!\"(
mkdir "%download_dir%!folder_name!"
)

その後、ファイルの移動を行います。

move "%%f" "%download_dir%!folder_name!\"

実行してみる

実際に上記のコードを実行してみます。
とりあえずデスクトップに配置していますが特に配置場所の指定はないです。

<実行前>

<実行後>

変わりませんでした…
おそらくファイルの取得部分がうまくできていないようなので、変数が取得できているか確認してみます。
下記コードを追加してみます。

::確認用
for %%f in ("%download_dir%\*") do (
    echo %%f
)

フォルダについては取得できていることが確認できました。
次に年月日の取得ができているか確認を行います。

:: 日付を確認するために表示
echo 年: !year!
echo 月: !month!
echo 日: !day!
echo フォルダ名: !folder_name!

こちらが実行できなかったため、年月日の変数取得がうまくいっていないようでした。
for文の設定方法がおかしい可能性があるため、for文の中身を下記に修正しました。

for %%f in (%download_dir%\*) do (
    :: ファイルの作成日を取得
    for /f "tokens=1,2 delims= " %%i in ('forfiles /p "%download_dir%" /m "%%~nxf" /c "cmd /c echo @fdate"') do (
        set file_date=%%i
    )

    :: 日付をスラッシュ区切りからハイフン区切りに変換
    set year=!file_date:~0,4!
    set month=!file_date:~5,2!
    set day=!file_date:~8,2!
    set folder_name=!year!-!month!-!day!

    :: 日付を確認するために表示
    echo ファイル: %%f
    echo 作成日: !year!-!month!-!day!
    echo フォルダ名: !folder_name!

こちらで実行したところ、文字化けが起こっているようでした。

UTF-8に変換するコードを追加します。

chcp 65001

上手く動作しました。
ダウンロードフォルダもうまく動作していそうです。

最終的なバッチ処理の中身は下記になります。

@echo off
chcp 65001
setlocal enabledelayedexpansion

:: ダウンロードフォルダのパスを設定
set "download_dir=%USERPROFILE%\Downloads"

:: ダウンロードフォルダ内のファイルを処理
for %%f in (%download_dir%\*) do (
    :: ファイルの作成日を取得
    for /f "tokens=1,2 delims= " %%i in ('forfiles /p "%download_dir%" /m "%%~nxf" /c "cmd /c echo @fdate"') do (
        set file_date=%%i
    )

    :: 日付をスラッシュ区切りからハイフン区切りに変換
    set year=!file_date:~0,4!
    set month=!file_date:~5,2!
    set day=!file_date:~8,2!
    set folder_name=!year!-!month!-!day!

    :: 日付を確認するために表示
    echo ファイル: %%f
    echo 作成日: !year!-!month!-!day!
    echo フォルダ名: !folder_name!

    :: フォルダが存在しない場合は作成
    if not exist "%download_dir%\!folder_name!\" (
        mkdir "%download_dir%\!folder_name!"
    )

    :: ファイルを該当の日付フォルダへ移動
    move "%%f" "%download_dir%\!folder_name!\" 
)

echo ファイルの整理が完了しました。
pause

終わりに

年月日取得部分で少し修正が入りましたが、無事フォルダ分けができました。もし私のようにダウンロードフォルダが煩雑になってしまっている方がいましたら是非ご活用ください。