簡體   English   中英

Powershell(PS2)記錄Remove-Item

[英]Powershell (PS2) logging Remove-Item

我是Powershell的新手,但到目前為止,我已經將一個腳本整合在一起,刪除了比定義的創建日期更早的文件並排除了某些文件類型。 但是,我正在努力將verbose和文件日志輸出結合起來。 我已經嘗試了我在網上找到的各種方法,我認為Out-File是最合適的,但我根本無法使其工作。 希望有人可以提供幫助!

    Set-StrictMode -Version Latest
    # $Logfile = "C:\Temp\Log.log"

    function Remove-Files([parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string] $Path, [parameter(Mandatory=$true)][DateTime] $DateTime, [switch] $WhatIf)

    {
        Get-ChildItem -Path $Path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $DateTime -and ($_.Name -notlike "*.txt"-and $_.Name -notlike "*.log")} |
        # Out-File -filepath $logfile -append 
        ForEach-Object { Remove-Item -Path $_.FullName -Force -WhatIf:$WhatIf}
    }

    Remove-Files -Path "C:\Temp" -DateTime ((Get-Date).AddDays(-10)) # -whatif

您沒有向日志文件發送任何內容。

取消注釋$logfile聲明,並將其用於實例:

ForEach-Object {
    Remove-Item -Path $_.FullName -Force -WhatIf:$WhatIf
    "Removed $($_.FullName)" | Out-File -FilePath $logfile -Append 
}

您要做的只是在刪除文件之前對文件進行Tee-Object 就像,字面上只是Tee-Object替換你的Out-File

function Remove-Files {
    [CmdletBinding()]
    param(
        [parameter(Mandatory=$true)]
        [ValidateScript({Test-Path $_})]
        [string]$Path,

        [parameter(Mandatory=$true)]
        [DateTime]$DateTime,

        # Personally, I would pass the log file as a parameter
        # [string]$LogFile,

        [switch]$WhatIf
    )

    Get-ChildItem -Path $Path -Recurse -Force | 
        Where-Object { 
            !$_.PSIsContainer -and 
            $_.CreationTime -lt $DateTime -and 
            ($_.lName -notlike "*.txt" -and $_.Name -notlike "*.log")
        } |
        Tee-Object -Filepath $LogFile -Append |
        Remove-Item -Force -WhatIf:$WhatIf
}


Remove-Files -Path "C:\Temp" -Log "C:\Temp\Rm.log" -DateTime ((Get-Date).AddDays(-10))

唯一的問題是:

  1. 日志中的輸出格式與輸出到控制台的格式相同,因此它不是您通常記錄的內容...
  2. 無論您是否刪除,日志都是相同的(即: -Whatif使其不刪除,但不會停止日志)

這是我更新的代碼,以使日志工作..

    function Remove-FilesCreatedBeforeDate([parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string] $Path, [parameter(Mandatory=$true)][DateTime] $DateTime, [string]$LogFile = "C:\Temp\Log.log", [switch] $WhatIf)
    {
        "LOG START $(Get-Date –f "yyyy-MM-dd HH:mm:ss")" | Out-File -FilePath $logfile -Append 
        Get-ChildItem -Path $Path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $DateTime -and ($_.Name -notlike "*.txt"-and $_.Name -notlike "*.log")} | 
        ForEach-Object { Remove-Item -Path $_.FullName -Force -WhatIf:$WhatIf 
        "$(Get-Date –f o) Removed $($_.FullName)" | Out-File -FilePath $logfile -Append | Write-host "Removed $($_.FullName)"}
        "LOG END $(Get-Date –f "yyyy-MM-dd HH:mm:ss")" | Out-File -FilePath $logfile -Append 
    }

    Remove-FilesCreatedBeforeDate -Path "C:\Temp" -DateTime ((Get-Date).AddDays(-0))

前段時間我創建了一個Log-Entry框架 ,您可以在其中進行內聯日志記錄,如:

Remove-Item -Path ( "Removing:" $_.FullName ) -Force -WhatIf:$WhatIf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM