経緯
フォルダを監視し、変更を検知すると指定フォルダへと自動バックアップするアプリケーションのテストの際、誤って監視フォルダ内にバックアップ先フォルダを作ってしまいました。
監視フォルダ/
│── バックアップ先フォルダ
その結果、ファイル変更検知とバックアップが無限に起き、一瞬で数十万の(それ以上かも!?)フォルダとファイルが生成されました。
数が多すぎるせいか何度削除しても消えてくれないゾンビにくらわす武器がありました!
PowerShellで削除
PowerShellで実行
Remove-Item -Path "削除したいアイテム群があるフォルダのパス" -Recurse -Force
めでたしめでたし
。。。fin
ちょっと待ってください、些細なことでも一手間加えたいというのがエンジニアの性ですよね。
削除アプリケーションを作る
問題点
- コマンドの手打ち
- 処理中の内容が表示されず、固まっているように見える
特に二番目は何とかしたいです。
私はフロントエンドエンジニアなので、サービス離脱を招く問題は見過ごせません。
構成
フォルダ/
│── 削除したいアイテム群
│── delete_file.bat
delete_file.batを実行して削除できるようにしましょう。
更に、現在削除中のアイテムを表示してユーザーに安心感を与えます。
メモ帳で作成したあと、UTF-8 (BOM 付き) で保存してください。
delete_file.bat
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: delete_file.batがあるフォルダを取得
set "TARGET_DIR=%~dp0"
:: delete_file.batの名前を取得
set "SCRIPT_NAME=%~nx0"
:: 一時フォルダ(WindowsのTempディレクトリ)を作成してdelete_file.batを移動
set "TEMP_DIR=%TEMP%\delete_temp"
mkdir "%TEMP_DIR%"
copy "%TARGET_DIR%%SCRIPT_NAME%" "%TEMP_DIR%\"
:: 削除中のファイル・フォルダをリアルタイム表示
for /f "usebackq delims=" %%A in (`PowerShell -Command "& { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-ChildItem -Path '%TARGET_DIR%' -Exclude '%SCRIPT_NAME%' -Recurse | Select-Object -ExpandProperty FullName }"`) do (
echo ■■■削除中: %%A■■■
PowerShell -Command "Remove-Item -Path '%%A' -Recurse -Force"
)
:: 削除が終わったらdelete_file.batを元の場所に戻す
move "%TEMP_DIR%\%SCRIPT_NAME%" "%TARGET_DIR%"
rmdir "%TEMP_DIR%"
echo ■■■■■■■■■■削除が完了しました。■■■■■■■■■■
pause
これからもファイルを無限に作成するミスを犯し続けようと思います。
ありがとうございました。
おすすめ記事