在PowerShell中定义参数

来源:互联网 发布:好域名的七大特点 编辑:程序博客网 时间:2024/06/06 04:34

在Windows PowerShell中有简单和复杂的方法来定义参数,两种方式都有各自的用途。
你编写的脚本或者函数经常需要接受某种输入, 这些输入可能是一个计算机名,文件路径或类似的东西。你可以告诉Windows PowerShell预计接收什么类型的参数,从命令行接收,然后在您的脚本或函数内的变量使用这些参数的值。 这使得输入变得简单而有效。
而你需要知道如何声明参数。 最简单的方法是使用参数块:

        Param(  [string]$computerName,  [string]$filePath)      

您没必要像我一样分行,因为在一行上写完也是合法的。 只是我更喜欢把它分解为几行,以便于阅读。 使用时,一般把参数定义写在一个脚本文件或者一个函数中的第一行,当有人运行脚本或函数时,Windows PowerShell会读取这些参数名称,甚至用tab来补齐参数名称,。 在此我小心地使用参数名称:–computerName 和–filePath。 这些使用方法和其他Windows PowerShell cmdlet的方法很相似。 这样一来,我的参数和已经存在的shell很一致。

如果我把这个参数定义用在名为Get-Something.ps1的脚本中,我想如下使用:

        ./Get-Something –computerName SERVER1 –filePath C:\Whatever      

我也可以截断参数的名称。 这让我输入更少的字符,他们仍然有效:

        ./Get-Something –comp SERVER1 –file C:\Whatever      

我甚至可以完全忽略参数名称。 Windows PowerShell将自动根据位置接收这些值。 在这里,我必须以与参数定义相同的顺序,提供这些参数值:

        ./Get-Something SERVER1 C:\Whatever      

当然,通过使用参数名,该命令让一个人更容易阅读一些,同时我也可以随意地将参数安放在不同的位置:

        ./Get-Something –filePath C:\Whatever –computerName SERVER1      

Windows PowerShell还提供了一中更复杂的声明参数的方式。 这更全面的语法强制你必须定义参数,且指定位置(如果你不这样做的话,那么该参数只能通过名称来使用)和其他更多的东西。 这种扩展的语法在脚本和函数中也是合法的:

        [CmdletBinding()]Param(  [Parameter(Mandatory=$True,Position=1)]   [string]$computerName,   [Parameter(Mandatory=$True)]   [string]$filePath)      

同样,你可以在一行上编写,但分行使得它更容易阅读。 我用 [Parameter()] 修饰两个参数,并定义它们为强制性的。

如果有人试图运行我的脚本,而忘记这些参数中的一个或两个,shell会自动提示他们。 对我而言,要做到这一点没有其他额外的工作。 我也定义了–computerName在第一个位置,但-filePath需要提供名称。

使用[CmdletBinding()]指令还有一些其他的优势 第一,它可以确保我的脚本或函数可以使用所有的Windows PowerShell中常见的参数,包括–Verbose 和 –Debug。 现在,我可以在我的脚本和函数中使用Write-Verbose 和 Write-Debug,它们的输出将被自动隐藏。

在脚本或函数中使用-verbose或-Debug,相应的Write-Verbose 或 Write-Debug也被激活。 这是一步一步产生进度信息或在你的脚本中添加调试断点(Write-Debug)的好方法。

如果不使用[string[]],这两个参数将只接受一个单一的值。声明[string[]]则可以使 他们接受一串值的集合。然后,你使用foreach循环列举它们,你就可以一次使用一个值。

另一个参数类型是[switch]

        Param([switch]$DoSomething)      

现在,我运行我的脚本或函数,而不使用-DoSomething参数,则-DoSomething的变量自动设为$False。 如果我运行的脚本带-DoSomething参数,$ DoSomething则被设置为$ True。 没有必要传递值给-DoSomething参数。Windows PowerShell中,如果你使用它,则将其设置为$ True,。 这是switch参数运行的方法,像Get-ChildItem的-Recurse参数。

请记住,每一个参数是它自己的实体,用逗号分开下一个参数。 你会发现,在前面的例子

        [CmdletBinding()]Param(  [Parameter(Mandatory=$True,Position=1)]   [string]$computerName,   [Parameter(Mandatory=$True)]   [string]$filePath)      

整个-computername参数包括出现在逗号前面的[Parameter()] 修饰符。 逗号表示我解释了第一个参数,我已经准备好继续到下一个。  如果我需要第三个参数,我需要加另外一个逗号:

        [CmdletBinding()]Param(  [Parameter(Mandatory=$True,Position=1)]   [string]$computerName,   [Parameter(Mandatory=$True)]   [string]$filePath,   [switch]$DoSomething)      

所有的参数都包含在Param() 块中。 请注意,您没有必要在每一个参数中使用[Parameter()] 修饰。 只有当你需要申明的参数是强制性的,接受管道输入,在确定的位置时。可以在Windows PowerShell中运行帮助about_functions_advanced_pa​​rameters获取其他属性的更多信息。在编写函数和脚本时,只通过参数接收输入是最佳的做法。 这使他们更加自主,更容易和shell的其他功能保持一致。


原创粉丝点击