3

该脚本搜索所有文件夹和子文件夹,并在文件数>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}*** 
    }
}
4

2 回答 2

2

首先,您需要log-message在脚本中使用 type 函数,将消息记录到 .log 文件中。然后检查文件是否存在,如果不存在则创建一个文件。

然后在使用命令删除文件之前,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 

    }
}
于 2013-08-29T17:43:14.733 回答
0

你有一个好的开始:

write-host “Deleting File $File” -foregroundcolor “Red”

不幸的是Remove-Item,没有任何输出可供您使用,但您已经制作了自己的输出消息,因此我们可以从中构建。您可以使用管道将任何输出传输到文件Out-File。append 标志会将新内容附加到文件的末尾,您不必检查文件是否存在。

Write-Output “Deleting File $File” | Out-File -Append logfile.txt

如果您想要更短的行,您甚至不必包含 Write-Output。

这是一个示例,显示您需要添加代码的位置。我已将现有代码标记为“...”,并将删除消息移动到一个变量中,以便您可以在另一个位置重用它。这假设您已将所选文件名存储在变量中。

...
if ($files.Count -gt $keep) 
{
    ...
    $message = "Deleting File $File at "+(Get-Date)
    $message | Out-File -Append logfile.txt 
}
...
于 2013-08-29T17:46:44.107 回答