1. スクリプト概要
スクリプト名: フォルダ削除.ps1
指定したフォルダ内のファイルのないフォルダを削除します。
指定フォルダそのものも削除対象です。
2. 処理と目的
処理の流れ
1. 対象フォルダをフルパスで指定します
2. 対象フォルダ内のファイルを検索します
3. ファイルが含まれていない場合、指定したフォルダを削除します
目的
NAS等のアクセスに時間がかかるフォルダで、内部のファイルを削除した後にフォルダを削除しようとすると、さらに時間がかかる場合があります。このスクリプトは、フォルダパスから直接フォルダを削除できるようにすることで、この時間を短縮することを目的としています
3. 動作環境と要件
PowerShellのバージョン
7.0以上
OS
Windows10
必要なモジュール
特になし
必要な権限
特になし
その他の設定
特になし
4. 使用方法
基本的な実行方法
スクリプトコードを拡張子ps1
で保存してPowershellで実行してください。
ファイルを保存する際は、文字コードをUTF8 BOM付
にしてください。
パラメータ
なし
使用例
- コマンドラインで
pwsh フォルダ削除.ps1
を実行します - 「対象フォルダ」のプロンプトが表示されるので、削除したいフォルダのフルパスを入力します
5. スクリプトコード
if( $PSVersionTable.PSVersion.Major -ge 7 -and ((ps -Id $PID | ?{$_.Parent.ProcessName -notin @('pwsh','powershell')}) -ne $null)){
cls
}
# コンソールウィンドウのタイトルをスクリプト名に設定します。
$host.UI.RawUI.WindowTitle = ([IO.Path]::GetFilenameWithoutExtension($PSCommandPath))
# エラー発生時にスクリプトの実行を停止するよう設定します。
$ErrorActionPreference = 'Stop'
echo "--------------------------------------------------------------------------"
Write-Host "対象フォルダが空の場合にフォルダを削除します" -ForegroundColor White -BackGroundColor Black
echo "--------------------------------------------------------------------------"
# ユーザーから対象フォルダのパスを入力してもらうループです。フォルダが存在しない場合は、再度入力を促します。
do {
$taishoDir = Read-Host "対象フォルダ"
$taishoDir = $taishoDir.Trim('"')
} while( -not ([IO.Directory]::Exists($taishoDir)) )
# 削除対象となるフォルダのリストを初期化します。
# まず、ユーザーが指定したフォルダをリストに追加します。
$dirlist = @($taishoDir)
# 処理の進捗状況をコンソールに表示します。
Write-Progress -Activity "searching..." -Status $taishoDir
# 指定したフォルダの直下にあるサブディレクトリをリストに追加します。
$dirlist += Get-ChildItem -LiteralPath $taishoDir -Directory
# フォルダリストを降順にソートします。これにより、サブフォルダから先に処理されます。
# (例: 親フォルダの前に子フォルダが削除されることを試みます)
$dirlist = $dirlist | Sort-Object -Descending
# 進捗表示を完了します。
Write-Progress -Completed
# フォルダリスト内の各フォルダに対して処理を実行します。
foreach($dirpath in $dirlist){
# 現在処理中のフォルダに対する進捗状況を表示します。
Write-Progress -Activity "searching..." -Status $dirpath
# 現在のフォルダ内にあるファイル(サブフォルダ内も含む)を検索します。
$infiles = Get-ChildItem -LiteralPath $dirpath -File -Recurse
# 進捗表示を完了します。
Write-Progress -Completed
# フォルダ内にファイルが存在しない場合($infilesが$nullの場合)に、そのフォルダを削除します。
if($infiles -eq $null){
Write-Host "Remove「$($dirpath)」" -ForegroundColor Yellow
Remove-Item -LiteralPath $dirpath # フォルダを削除します。
}
}
pause
6. 注意事項と既知の問題
既知のバグ
もしバグを発見された場合は、コメントでご報告ください。
トラブルシューティング
・ps1ファイルのエンコーディングには注意してください。
7. 免責事項
本スクリプトにはいかなる保証もありません。使用は自己責任で行ってください。