web-dev-qa-db-ja.com

x個のファイルを保持し、他のすべてのファイルを削除します-Powershell

一連のフォルダーを調べて、最後の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より大きい引数を指定してから、コマンドを再試行してください。

20
mpowmap

CreationTimeの降順で並べ替えて、最初の10個をスキップできます。ファイルが10個未満の場合、ファイルは削除されません。

gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 10| Remove-Item -Force
43
Rynant

更新

$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に削除します。

8
Andy Arismendi

@Andy:私の担当者はコメントするには低すぎるので、回答を投稿してください。奇妙な結果が得られた場合は、Windowsエクスプローラーで、デフォルトで作成日ではなく最終更新日が表示されていることが原因である可能性があります。 Windowsエクスプローラーに表示される結果と一致する結果を得るには、次のようにLastWriteTimeをCreationTimeに交換します。gciC:\ temp\-Recurse |ここで{-$ _。PsIsContainerではありません} | LastWriteTime -desc |を並べ替えます選択-スキップ10 |アイテムの削除-強制

1
user189271

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
0
Sanky