一連のフォルダーを調べて、最後の10個のファイルのみを保持するスクリプトを作成しようとしています。各フォルダ内のファイルは、毎日、毎週、または毎月作成できます。作成日や変更日に関係なく、最新の10個のコピーを保持するスクリプトが必要です。
別の投稿を使用して、以下のスクリプトを作成しました。このスクリプトは機能しますが、10個のコピーを保持せず、10日以内のファイルを保持します。
$ftppath = "C:\Reports"
Get-ChildItem $ftppath -recurse *_Report_*.Zip -force|where {$_.lastwritetime -lt (get-date).adddays(-10)} |Remove-Item -force
これをどのように調整して機能させることができるかについてのアイデアはありますか?以下のスクリプトを使用すると機能しますが、-Recurseを設定しない場合に限ります。 -Recurseスイッチを使用すると、スクリプトの下にリストしたエラーが発生します。
# Keeps latest 10 files from a directory based on Creation Time
#Declaration variables
$path = "C:\Reports" # For example $path= C:\log\*.tmp
$total= (ls $path).count - 10 # Change number 5 to whatever number of objects you want to keep
# Script
ls $path |sort-object -Property {$_.CreationTime} | Select-Object -first $total | Remove-Item -force
エラー:Select-Object:パラメータ 'First'の引数を検証できません。 -7引数が最小許容範囲の0未満です。0より大きい引数を指定してから、コマンドを再試行してください。
CreationTime
の降順で並べ替えて、最初の10個をスキップできます。ファイルが10個未満の場合、ファイルは削除されません。
gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc|
select -Skip 10| Remove-Item -Force
更新
$path = "C:\TestDir"
# Create 12 test files, 1 second after each other
1..12 | % {
Remove-Item -Path "$path\$_.txt" -ea SilentlyContinue
$_ | Out-File "$path\$_.txt"
Start-Sleep -Seconds 1
}
$files = Get-ChildItem -Path $path -Recurse | Where-Object {-not $_.PsIsContainer}
$keep = 10
if ($files.Count -gt $keep) {
$files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force -WhatIf
}
実際に削除する準備ができたら、-WhatIf
パラメータをRemove-Item
に削除します。
@Andy:私の担当者はコメントするには低すぎるので、回答を投稿してください。奇妙な結果が得られた場合は、Windowsエクスプローラーで、デフォルトで作成日ではなく最終更新日が表示されていることが原因である可能性があります。 Windowsエクスプローラーに表示される結果と一致する結果を得るには、次のようにLastWriteTimeをCreationTimeに交換します。gciC:\ temp\-Recurse |ここで{-$ _。PsIsContainerではありません} | LastWriteTime -desc |を並べ替えます選択-スキップ10 |アイテムの削除-強制
SQLサーバーでこのGCIコマンドを呼び出す方法は、以下のコードを試していましたが、エラーを返しました
declare @deleteoldtempxe nvarchar(1000)
set @deleteoldtempxe='powershell.exe gci '+''''+ 'I:\New folder\'+''''+' -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc|
select -Skip 1| Remove-Item -Force'
select @deleteoldtempxe
EXEC master.dbo.xp_cmdshell @deleteoldtempxe