Powershell 参数集的最佳实践设置

Powershell 参数集的最佳实践设置,powershell,parameters,Powershell,Parameters,我正在尝试设置参数集,但我不确定这是否是我尝试执行的最佳实践方法。我正在查找的设置如下所示: $FolderSetup - Not Manditory. [ValidateSet("Yes", "No"] Default is "No" If "Yes" is used, then no following parameters should be able to be selected $OSVersion - Manditory. [ValidateSet("2008SP2",

我正在尝试设置参数集,但我不确定这是否是我尝试执行的最佳实践方法。我正在查找的设置如下所示:

$FolderSetup - Not Manditory.  [ValidateSet("Yes", "No"] Default is "No"
    If "Yes" is used, then no following parameters should be able to be selected
$OSVersion - Manditory.  [ValidateSet("2008SP2", "2008R2", "2012R2", "2016", "All")].  
    If "All" is used, then no following parameters should be able to be selected

$InputFile - Not Manditory - User inputs location of file
$OutputFolder - Not Manditory.  - User inputs desired output location
    $InputFile must be used before $OutputFolder can be used.
示例:

SinglePackage -FolderSetup 'Yes'
    #No Other Parameters can be used
SinglePackage -OSVersion 'All'
    #No Other Parameters can be used
SinglePackage -OSVersion '2008SP2'
SinglePackage -OSVersion '2008SP2' -InputFile 'C:\Temp\MyFile.txt'
SinglePackage -OSVersion '2008SP2' -InputFile 'C:\Temp\MyFile.txt' -OutputFolder 'C:\Temp\MyFolder'
SinglePackage -OSVersion '2008SP2' -OutputFolder 'C:\Temp\MyFolder'
    #Not Allowed.  Must have -InputFile if using -OutputFolder   

这是你如何做你要求的参数

Function TEST(){
    Param(
        [Parameter(Position=0, Mandatory=$true)]
        [switch]$FolderSetup,

        [Parameter(Position=1, Mandatory=$false)]
        [ValidateSet("2008SP2", "2008R2", "2012R2", "2016", "All")]
        [string]$OSVersion,

        [Parameter(ParameterSetName="InputFiles", Mandatory=$false)]
        [string]$InputFile,

        [Parameter(ParameterSetName="InputFiles", Mandatory=$false)]
        [string]$OutputFolder
    )

}

我认为最好的方法是如下声明参数块:

param(
    [Parameter(Mandatory=$true,ParameterSetName="Folder")]
    [switch]$FolderSetup,

    [Parameter(Mandatory=$true,ParameterSetName="AllVersions")]
    [Alias("AllOS")]
    [switch]$All,

    [Parameter(Mandatory=$true,ParameterSetName="OSSpecific")]
    [Parameter(Mandatory=$true,ParameterSetName="IOFolders")]
    [ValidateSet("2008SP2","2008R2", "2102R2", "2016")]
    [string]$OSVersion,

    [Parameter(Mandatory=$true,ParameterSetName="IOFolders")]
    [string]$InputFolder,

    [Parameter(ParameterSetName="IOFolders")]
    [string]$OutputFolder
)
这将强制调用采用上面给出的有效形式之一,并禁止无效组合。如果它不能确定正在使用哪一组参数,它将抛出一个错误,这样说-但这保证了尝试了无效的参数组合


它有一个限制,您不能使用
-OSVersion“All”
;改用
-All
-AllOS

不清楚你在问什么。请提供一些如何调用脚本的示例。根据我所看到的情况,您不能在参数设置中这样做。您需要在函数中执行此操作errors@JeffZeitlin我补充了一些例子。请让我知道我是否应该尝试进一步解释。@ArcSet,所以这是不可能的。好啊谢谢ArcSet。这正是我想知道的。让
$FolderSetup
作为
[switch]
更有意义。他正在寻找最佳实践,因此值得包括“正确”的方法吗?谢谢@arcet,但您似乎忽略了一些事情。请看我列举的例子。我希望他们能帮助我解释我在寻找什么,或者我在寻找什么是可能的
$FolderSetup
不是强制性的,但如果将其设置为
Yes
,则它是唯一可以使用的参数<仅当选择了
$OutputFolder
时,code>InputFile才是必需的。