grep.ps1を参考にして作りました。
削除できるのはファイルだけで、フォルダは対象外です。
#以下のフォルダにある全アイテムを検索し削除します。 Remove-File -r #aから始まるファイルやフォルダをサブフォルダも含めて検索し削除します。 Remove-File -r -in a* #ファイル名が*.txtにマッチし、backup*にマッチしなくて、30日以上前に作成されたものを、カレントフォルダのみ検索し削除します。 Remove-File -i *.txt -e backup* -days 30 #ファイル名が*.ps1にマッチしなくて、7日以上前に作成されたファイルを、再帰的にサブフォルダも検索し削除します。 Remove-File -r -path c:\temp\* -e *.ps1 -days 7 #ファイル名が*.txtにマッチし、10日以上前に作成されたファイルを検索し削除します。 Remove-File -r -in *.txt -days 10
Remove-File.ps1
#$r:オプションの-rで再帰検索が指定できる
#$nofilter:このスイッチが指定されると$filterは無視される。ファイル名だけでの検索になる。
#$SimpleMatch:$filterで指定されたものをただのテキスト検索とするかどうか
#$filter:検索文字列(正規表現)
#$include:ファイル名の指定
#$exclude:ファイル名で除外するもの
#$days:何日前に作成されたファイルを削除するのか指定します
#$path:検索する対象のパス(省略時はカレントディレクトリになります)
#-Encodingでdefaultを指定すると、日本語OSではシフトJISになります。
param([switch] $r, $include, $exclude, $days, $path)
#ファイル名が.\xxx.txtという感じで.\がついていた時のための処理
if($include -ne $null)
{
if($include.StartsWith(".\"))
{
$include = $include.Remove(0,2)
}
}
#ファイル名が.\xxx.txtという感じで.\がついていた時のための処理
if($exclude -ne $null)
{
if($exclude.StartsWith(".\"))
{
$exclude = $exclude.Remove(0,2)
}
}
#パスが指定されない時の処理
if($path -eq $null)
{
$path = "*"
}
if($r -eq $false){
$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude | Where-Object{$_.PSIsContainer -eq $false } | Where-Object{((Get-Date).Subtract($_.LastWriteTime)).Days -ge $days}
}elseif($r -eq $true){
$result = Get-ChildItem -Path $path -Include $include -Exclude $exclude -Recurse -Force | Where-Object{$_.PSIsContainer -eq $false } | Where-Object{((Get-Date).Subtract($_.LastWriteTime)).Days -ge $days}
}
#削除候補の一覧表示
$result
#ヒット数の表示
if($result -eq $null){
#0件の場合
"`nCount`n---------`n" + 0
}elseif($result.gettype().fullname.toupper() -eq "SYSTEM.OBJECT[]"){
#2件以上の場合
"`nCount`n---------`n" + $result.length
}else{
#1件の場合
"`nCount`n---------`n" + 1
}
"削除しますか?(y/n)"
$ans = Read-Host
if($ans.ToLower() -eq "y")
{
#何もしない
}else{
return
}
#削除処理
$result | Foreach-Object{Remove-Item $_}
