我正在尝试为函数提供一些变量,并且在未给出任何变量的情况下,OlderThanDays应该使用默认值30。由于一个或另一个原因,这没有达到我的预期。

我通过使用if($_.B -ne $null) {$OlderThanDays=$_.B} else {$OlderThanDays="30"}在ForEach循环中解决了我的问题,但我认为这不是最佳实践。谁能告诉我[Int]$OlderThanDays=30为什么不起作用?

问题:在我的csv文件中添加一行而未定义OlderThanDays变量时,未使用默认值30天,并且仅删除了文件...

谢谢您的帮助。

CSV文件:

# Correct input formats are:
#
# ServerName, LocalPath, OlderThanDays
# Ex: server, E:\SHARE\Target, 10
# Ex: server, E:\CBR\SHARE\Target
#
# UNC-Path, OlderThanDays
# Ex: \\domain\SHARE\Target, 20
# Ex: \\domain\Target
#
# If no 'OlderThanDays' is provided, a default of 30 days will be used
# Commenting out can be done with '#'
# ______________________________________________________________________

SERVER1, E:\SHARE\Target
\\domain\SHARE\Target2

完整脚本:
#__________________________________________________________________________________________________________________________________
$ImportFile = "S:\Input\Scheduled Task\Auto_Clean.csv"
$Password = cat "S:\Input\pwd.txt" | ConvertTo-SecureString -Force
$UserName = "domain\me"
#__________________________________________________________________________________________________________________________________
# Scriptblock for running the function in a job
$JobCall = {
    # Function that removes files older than x days in all subfolders
    Function Delete-OldFiles {
    [CmdletBinding(SupportsShouldProcess=$True)]
    Param(
        [Parameter(Mandatory=$True,Position=1)]
        [ValidateScript({Test-Path $_})]
        [String]$Target,
        [Parameter(Mandatory=$False,Position=2)]
        [Int]$OlderThanDays=30,
        [Parameter(Mandatory=$False,Position=3)]
        [String]$Server,
        [switch]$CleanFolders
          )

    #__________________________________________________________________________________________________________________________________
    # Create logfile
    $TempDate = (get-date).ToString("dd-MM-yyyy")
    $TempFolderPath = $Target -replace '\\','_'
    $TempFolderPath = $TempFolderPath -replace ':',''
    $TempFolderPath = $TempFolderPath -replace ' ',''

    $script:LogFile = "\\DEUSTHEIDIT02\Log\Scheduled Task\Auto_Clean\$Server - $TempFolderPath - $TempDate.log"

    #__________________________________________________________________________________________________________________________________
    # Check the version of PowerShell
    if ($PSVersionTable.PSVersion.Major -ge "3") {

        # PowerShell 3+ Remove files older than (FASTER)
        Get-ChildItem -Path $Target -Recurse -File |
        Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$OlderThanDays) } |

            ForEach {
            $Item = $_.FullName
            Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue

                # Log succes/failure
                $Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()
                if (Test-Path $Item) {
                    "$Timestamp | FAILLED: $Server $Item (IN USE)"
                }
                else {
                    "$Timestamp | REMOVED: $Server $Item"
                }
            } | Tee-Object $LogFile -Append -Verbose}

    Else {

        # PowerShell 2 Remove files older than
        Get-ChildItem -Path $Target -Recurse |
        Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt (Get-Date).AddDays(-$OlderThanDays) } |

            ForEach {
            $Item = $_.FullName
            Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue

                # Log succes/failure
                $Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()
                if (Test-Path $Item) {
                    Write-Host "$Timestamp | FAILLED: $Server $Item (IN USE)"
                   "$Timestamp | FAILLED: $Server $Item (IN USE)"
                }
                else {
                      Write-Host "$Timestamp | REMOVED: $Server $Item"
                     "$Timestamp | REMOVED: $Server $Item"
                }
            } | Out-File $LogFile -Append }

    #__________________________________________________________________________________________________________________________________
        # Switch -CleanFolders deletes empty folders older than x days
        if ($CleanFolders) {

            # Check the version of PowerShell
            if ($PSVersionTable.PSVersion.Major -ge "3") {

                # PowerShell 3+ Remove empty folders older than (FASTER)
                Get-ChildItem -Path $Target -Recurse -Force -Directory  -ErrorAction SilentlyContinue |
                Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$OlderThanDays) } |
                Where-Object { (Get-ChildItem -Path $_.FullName -Recurse -Force -File) -eq $null } |

                    ForEach {
                    $Item = $_.FullName
                    Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue

                        # Log succes/failure
                        $Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()
                        if (Test-Path $Item) {
                            "$Timestamp | FAILLED: $Server $Item (IN USE)"
                        }
                        else {
                            "$Timestamp | REMOVED: $Server $Item"
                        }
                    } | Tee-Object $LogFile -Append
            }

            else {

                # PowerShell 2 Remove empty folders older than
                Get-ChildItem -Path $Target -Recurse -Force -ErrorAction SilentlyContinue |
                Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } |
                Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$OlderThanDays) } |

                    ForEach {
                    $Item = $_.FullName
                    Remove-Item $Item -Recurse -Force -ErrorAction SilentlyContinue

                        # Log succes/failure
                        $Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()
                        if (Test-Path $Item) {
                            Write-Host "$Timestamp | FAILLED: $Server $Item (IN USE)"
                            "$Timestamp | FAILLED: $Server $Item (IN USE)"
                        }
                        else {
                            Write-Host "$Timestamp | REMOVED: $Server $Item"
                            "$Timestamp | REMOVED: $Server $Item"
                        }
                    } |  Out-File $LogFile -Append
            }
        }
    }
# Lact command of the ScriptBlock: Call the magic to happen
Delete-OldFiles $args[0] $args[1] $args[2] -CleanFolders:$args[3]
}

#__________________________________________________________________________________________________________________________________
# Read input file and ignore all lines starting with #
$File = (Import-Csv -Path $ImportFile -Header "A", "B", "C", "D" | Where { $_.A -NotLike "#*" } )

#__________________________________________________________________________________________________________________________________
# If the UNC Path is provided we will run the script locally else it wil be run on the remote server as a job
Foreach ($_ in $File) {

    # Define input format & default values
    if ($_.A -like "\\*") {
        $Server="UNC"
        $Target=$_.A
        $OlderThanDays=$_.B
        $CleanFolders=$_.C
    }
    else {
        $Server=$_.A
        $Target=$_.B
        $OlderThanDays=$_.C
        $CleanFolders=$_.D
    }

            # Call the scriptblock with the function to run locally or on the remote server
            if ($Server -eq "UNC")
            {
                Write-Host "UNC Path detected: $Target, $OlderThanDays" -ForegroundColor Yellow
                Start-Job -ScriptBlock $JobCall -ArgumentList ($Target, $OlderThanDays, $Server) -Name DelFiles
            }
            else
            {
                Write-Host "Local path detected: $Server, $Target, $OlderThanDays" -ForegroundColor Cyan
                $Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName,$Password
                Invoke-Command -ScriptBlock $JobCall -ArgumentList ($Target, $OlderThanDays, $Server) -ComputerName "$Server.domain" -Authentication Credssp -Credential $Credentials -AsJob -JobName DelFiles

                # Delete empty folders: Invoke-Command -ScriptBlock $JobCall -ArgumentList ($Target, $OlderThanDays, $Server, $true) -ComputerName "$Server.domain" -Authentication Credssp -Credential $Credentials -AsJob -JobName DelFiles
            }
}

最佳答案

该参数既不能是必需的,也不能具有默认值。首先检查Former,如果将其设置为$true,则默认值将被忽略。如果要确保用户不能指定空值,请使用[ValidateNotNullorEmpty()]验证,并将参数设置为可选。

10-06 05:29