我有一个函数可以将超过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
}
}
答案 0 :(得分:0)
[Int]$Quantity(Mandatory=$true)