脚本搜索所有文件夹和子文件夹,并在文件数> 5时删除最旧的文件。一切正常,但我还想将所有删除文件记录为日志文件中的记录。
如何记录已删除的文件?
这里是剧本。
$path = "C:\test\1"
$keep = 3
$strLogFileName = "c:\test\yourlogfile.log";
$dirs = Get-ChildItem -Path $path -Recurse | Where-Object {$_.PsIsContainer}
foreach ($dir in $dirs) {
$files = Get-ChildItem -Path $dir.FullName | Where-Object {-not $_.PsIsContainer -and $_.name -like "*.zip"}
if ($files.Count -gt $keep) {
$files | Sort-Object CreationTime -desc| Select-Object -First ($files.Count - $keep) | Remove-Item -Force
***{write-host “Deleting File $File” -foregroundcolor “Red”; Remove-Item $File | out-null}***
}
}
答案 0 :(得分:2)
首先,您需要在脚本中使用log-message
类型函数,该函数会将消息记录到.log文件中。然后chekc如果文件存在,如果不存在则创建一个文件。
然后在使用Remove-Item
命令删除文件之前,可以使用Log-Message
函数将消息记录到日志文件中。
% { (Log-Message "Deleting File $_"); $_ }
完整的脚本
$path = "C:\test\1"
$keep = 3
$strLogFileName = "c:\test\yourlogfile.log";
function Log-Message
{
Param ([string]$logtext)
Add-content $strLogFileName -value $logtext
}
$dirs = Get-ChildItem -Path $path -Recurse | Where-Object {$_.PsIsContainer}
foreach ($dir in $dirs) {
$files = Get-ChildItem -Path $dir.FullName | Where-Object {-not $_.PsIsContainer -and $_.name -like "*.zip"}
if ($files.Count -gt $keep) {
$files | Sort-Object CreationTime -desc| Select-Object -First ($files.Count - $keep) |
% { $dt=get-date;(Log-Message "Deleting File $_ on $dt");$_ }| Remove-Item -Force
}
}
答案 1 :(得分:0)
你在这里有一个好的开始:
write-host “Deleting File $File” -foregroundcolor “Red”
不幸的是Remove-Item
没有任何可以输出的输出,但是你已经创建了自己的输出消息,所以我们可以从中构建。您可以使用Out-File
将任何输出传输到文件。 append标志会将新内容附加到文件末尾,而不必检查文件是否存在。
Write-Output “Deleting File $File” | Out-File -Append logfile.txt
如果您想要更短的线路,您甚至不必包括写入输出。
以下示例显示了您需要添加代码的位置。我用“...”标记了现有代码,并且我已将删除消息移动到变量中,以便您可以在其他位置重复使用它。这假设您已将选定的文件名存储在变量中。
...
if ($files.Count -gt $keep)
{
...
$message = "Deleting File $File at "+(Get-Date)
$message | Out-File -Append logfile.txt
}
...