【问题标题】:Powershell log deleted filesPowershell 日志删除文件
【发布时间】:2013-08-29 17:14:28
【问题描述】:

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

【问题讨论】:

    标签: file powershell logging delete-file


    【解决方案1】:

    首先,您需要在脚本中使用log-message 类型函数,将消息记录到 .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 
    
        }
    }
    

    【讨论】:

    • OK 看起来很完美,但你能告诉我如何将每个文件的删除文件的日期时间添加到日志中吗??
    • 你真的是 powershell 的神 :) 最后一个问题,我怎样才能只删除最旧的文件而不删除最新的文件?非常感谢您的帮助
    • 谢谢我找到了它:Sort-Object LastWriteTime
    • 我再次需要你的帮助。现在不应删除 zip 文件,但应删除更高级别的文件夹。这里的文件夹路径:\\xxx\xu_207\Archiv\20080101 你能再帮我一次吗?多谢
    • @zero1de 您应该在新问题中提出这个新问题,然后投票和/或接受解决了您之前问题的答案。在没有适当地归功于他的情况下将 Mitul 串起来是非常粗鲁的,并且可能会阻止用户将来帮助您。
    【解决方案2】:

    你有一个好的开始:

    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 
    }
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-30
      • 2010-11-16
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      相关资源
      最近更新 更多