【问题标题】:Mandatory parameter for inner function内部函数的强制参数
【发布时间】:2015-11-13 10:00:33
【问题描述】:

我一直在试图找出从函数调用函数并使两个函数都强制参数的最佳方法。到目前为止,我已经掌握了以下内容,并且一切正常,因为我知道要指定哪些 cmdline 参数。

我确实找到了this post,但我不确定如何将它与调用函数的函数一起使用。

编辑:添加了更短的代码。在代码中,如何使父函数main 和子函数KillSwitch 的ParamSet 参数[string]$killserver 强制,这样如果函数运行main -nukejobs,Powershell 会提示输入变量$killserver

编辑 2: 解决了强制参数 serverlistdatelist 的提示,但现在看来子函数没有写入主机 "receive input from $serverlist and $datelist"

编辑 3: 更正了 Switch ($PSCmdlet.ParameterSetName){RunMulti 值,现在看起来不错。

Function Main{
  [CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")]
  Param(
    [Parameter(Mandatory=$false,ParameterSetName="KillSwitch")]
    [Switch]$NukeJobs,
    [Parameter(Mandatory=$true,ParameterSetName="KillSwitch",
      HelpMessage="Enter ServerName to remove the scheduled reboot for, Check using main -viewonly")]
    [String]$killserver,
    [Parameter(Mandatory=$false,ParameterSetName="RunMulti")]
    [switch]$RunMultiple,
    [Parameter(Mandatory=$true,ParameterSetName="RunMulti")]
    [String]$serverlist,
    [Parameter(Mandatory=$true,ParameterSetName="RunMulti")]
    [String]$datelist
  )

  Switch ($PSCmdlet.ParameterSetName) {
    "KillSwitch" {
      KillSwitch -server $killserver
    } # end killswitch
    "RunMulti" {
      RunMulti -serverlist $serverlist -datelist $datelist
    } # end run multi
  } # end switch block
} # end main function

Function KillSwitch{
  Param(
    [Parameter(Mandatory=$true)]
    [String]$server
  )

  "Removing previous scheduled reboot for $server"
} # end killswitch function

Function RunMulti {
  Param(
    [Parameter(Mandatory=$true,
      HelpMessage="Text file with server names to reboot, one per line!")]
    [string]$serverlist,
    [Parameter(Mandatory=$true,
      HelpMessage="Text file with date/times, one per line!")]
    [String]$datelist
  )

  "receive input from $serverlist and $datelist"
}

【问题讨论】:

  • 恐怕我不明白[Parameter(Mandatory=$true)] 怎么不是你想要的。这就是你如何使参数成为强制性的。也许您有一个简短的代码示例来概述您的问题?
  • 修改代码,添加更好的例子。
  • 根据你的代码,当我运行main -NukeJobs 时,我被要求输入 killserver 参数,你得到的结果不是一样吗?
  • 您现在使用main -nukejobs PowerShell 的方式会提示您输入$killserver... 因此,如果在killswitch 中适当地调用main,则永远不会有问题跨度>
  • 抱歉,问题出在RunMultiple,因为在代码所在的位置,Powershell 不会提示输入最终将成为文件路径的参数。

标签: function powershell


【解决方案1】:

我发现需要单独的强制参数:

[Parameter(Mandatory=$true,ParameterSetName="RunOnce")] 块。

例如,这不起作用,即使Mandatory=$true

我的猜测是因为它只适用于[switch]

[Parameter(Mandatory=$false,ParameterSetName="RunOnce",
HelpMessage="Enter ServerName to schedule reboot for.")]
[switch]$RunOnce,
[string]$server,
[string]$date,

但这会起作用,当给出RunOnce 开关时,Powershell 会提示输入$server$date

[Parameter(Mandatory=$false,ParameterSetName="RunOnce",
 HelpMessage="Enter ServerName to schedule reboot for.")]
 [switch]$RunOnce,
[Parameter(Mandatory=$true,ParameterSetName="RunOnce")]
 [string]$server,
[Parameter(Mandatory=$true,ParameterSetName="RunOnce")]
 [string]$date,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2015-05-24
    • 2013-06-23
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多