如何在powershell函数中使用c#switch参数?

时间:2014-11-25 21:07:40

标签: function powershell parameters

我有一个功能

getinfo([string]$subcommand, [string]$argument)

我想做的是让参数值为'-h'或'-help',以便

getinfo hosts -h

将为子命令“hosts”提供帮助文本。不幸的是,当我指定-h时,我认为它不会将“-h”的值赋给$参数,而是创建一个新参数。

我在考虑使用switch参数,但我不确定我是否可以在函数中使用它与上面的$ argument一起使用。

这可能吗?

2 个答案:

答案 0 :(得分:5)

退一步,你试图在PowerShell上强制命令范例,这不是我称之为惯用的PowerShell。为什么不用自己的帮助创建几个函数,例如Get-HostInfo,Get-FooInfo等。然后您可以使用PowerShell的内置文档支持,例如:

<#
.SYNOPSIS
   Short description
.DESCRIPTION
   Long description
.PARAMETER Host
    Name of the host.
.EXAMPLE
   Example of how to use this cmdlet
.EXAMPLE
   Another example of how to use this cmdlet
#>
function Get-HostInfo($host) { ... }

这支持PowerShell用户期望的所有方式的帮助:

man Get-HostInfo
man Get-HostInfo -Example
man Get-HostInfo -Parameter Host
Get-HostInfo -?

答案 1 :(得分:0)

我这样做:

getinfo([string]$subcommand, [switch][alias("h")]$Help) {
  switch ($subcommand) {
    'hosts' {
       if ($Help) { 'Usage: getinfo hosts ...'; return }
       ...
    }
    ...
  }
}

所有与参数不匹配的参数都会自动存储在变量$args中,因此您并不需要参数$argument。它具有优势(或缺点,取决于您的观点),它甚至接受PowerShell将其解释为参数的参数。例如:

PS C:\> function getinfo($subcommand, [switch]$Help, $argument) {
>>   if ($Help) { 'help' }
>>   $argument
>> }
>>
PS C:\> getinfo 'a' 'b'
b
PS C:\> getinfo 'a' -x
PS C:\> getinfo 'a' 'b' -h
help
b
PS C:\> getinfo 'a' -x -h
help
PS C:\> function getinfo($subcommand, [switch]$Help) {
>>   if ($Help) { 'help' }
>>   $args[0]
>> }
>>
PS C:\> getinfo 'a' 'b'
b
PS C:\> getinfo 'a' -x
-x
PS C:\> getinfo 'a' 'b' -h
help
b
PS C:\> getinfo 'a' -x -h
help
-x