Powershell参数列表传递像-a <args list =“”> -d <args list =“”> </args> </args>

时间:2011-08-26 02:40:30

标签: powershell arguments command-line-arguments variadic-functions

我想编写一个powershell ps1脚本,它需要2个参数集( - a -d),每个脚本最多可以有n个属性。如何实现?

example : DoTheTask -a <task name 1> <task name 2> ...  -d <machine name 1> <machine name 2>...

3 个答案:

答案 0 :(得分:6)

你可以这样做:

param(
    [string[]]$a,   
    [string[]]$d
)

write-host $a
write-host ----
write-host $d

然后你可以拨打DoTheTask -a task1,task2 -d machine1,machine2

答案 1 :(得分:0)

您是否可以组织您的任务名称和计算机名称,以便将它们放入带分隔符的单个字符串中。

换句话说,你的-a参数是一个字符串,逗号分隔的任务名称和你的-d参数是一串逗号分隔的机器名吗?如果是这样,那么您需要做的就是在脚本开头将字符串解析为其组件。

答案 2 :(得分:0)

如果要将这些参数传递给脚本本身,则可以利用$args内部变量,尽管键/值映射会有点棘手,因为PowerShell会将每个语句解释为参数。我建议(和其他人一样)你使用另一个分隔符,这样你就可以更容易地进行映射。

尽管如此,如果您想继续这样做,您可以使用如下所示的功能:

 Function Parse-Arguments {
    $_args = $script:args                                # set this to something other than $script:args if you want to use this inside of the script.
    $_ret  = @{}         
    foreach ($_arg in $_args) {
        if ($_arg.substring(0,1) -eq '-') {
            $_key = $_arg; [void]$foreach.moveNext()     # set the key (i.e. -a, -b) and moves to the next element in $args, or the tasks to do for that switch
            while ($_arg.substring(0,1) -ne '-') {       # goes through each task until it hits another switch
                $_val = $_arg
                switch($_key)    {
                     '-a'     {
                          write-host "doing stuff for $_key"
                          $ret.add($_key,$_val)          # puts the arg entered and tasks to do for that arg.
                     }

                     # put more conditionals here
                }
            }
        }
    }
 }