PowerShell不要等待参数

时间:2014-09-23 10:06:56

标签: powershell parameters

我有一个函数可以将超过x天的文件从一个目录移动到另一个目录。这与两个可用参数集完美配合。当我手动运行该函数并忘记Quantity时,PowerShell会提示我填写它。这就是它应该如何。

但是,当我运行解决这些参数的脚本并忘记输入CSV文件中的Quantity时,它不会为丢失的Quantity引发错误。如果没有提供错误,我怎么强迫它抛出错误?所以它不会等待或促使我填写它......

语法:

    Move-Files [-Source] <String> [[-Destination] <String>] [-Structure <String>] [-WhatIf ] [-Confirm ] [<CommonParameters>]

    Move-Files [-Source] <String> [[-Destination] <String>] [-Structure <String>] -OlderThan <String> -Quantity <Int32> [-WhatIf ] [-Confirm ] [<CommonParameters>]

参数:

Function Move-Files {
    [CmdletBinding(SupportsShouldProcess=$True,DefaultParameterSetName='A')]
    Param (
        [parameter(Mandatory=$true,Position=0,ParameterSetName='A')]
        [parameter(Mandatory=$true,Position=0,ParameterSetName='B')]
        [ValidateNotNullOrEmpty()]
        [ValidateScript({Test-Path $_ -PathType Container})]
        [String]$Source,
        [parameter(Mandatory=$false,Position=1,ParameterSetName='A')]
        [parameter(Mandatory=$false,Position=1,ParameterSetName='B')]
        [ValidateNotNullOrEmpty()]
        [ValidateScript({Test-Path $_ -PathType Container})]
        [String]$Destination = $Source,
        [parameter(Mandatory=$false,ParameterSetName='A')]
        [parameter(Mandatory=$false,ParameterSetName='B')]
        [ValidateSet('Year','Year\Month','Year-Month')]
        [String]$Structure = 'Year-Month',
        [parameter(Mandatory=$true,ParameterSetName='B')]
        [ValidateSet('Day','Month','Year')]
        [String]$OlderThan,
        [parameter(Mandatory=$true,ParameterSetName='B')]
        [Int]$Quantity
    )

我的剧本中的行:

Move-Files -Source 'S:\Test' -Destination 'S:\Target' -Structure Year\Month -OlderThan Day

这在foreach循环中使用,如下所示:

$File | ForEach-Object {

    $MoveParams = @{
        Source = $_.Source
        Destination = $_.Destination
        Structure = $_.Structure
        OlderThan = $_.OlderThan
        Quantity = $_.Quantity
    }

Try {
   Move-Files @MoveParams
}
Catch {
   "Error reported"
}

解决方法:

$MoveParams.Values | ForEach-Object {
    if ($_ -eq $null) {
        Write-Error "Incomplete parameters:`n $($MoveParams | Format-Table | Out-String)"
        Return
    }
}

1 个答案:

答案 0 :(得分:0)

[Int]$Quantity(Mandatory=$true)