参数

已完成

创建几个脚本后,你可能会注意到脚本并不灵活。 进入你的脚本以对其进行更改并不是那么有效。 有一种更好的方法来处理更改:使用参数。

使用参数可以使脚本变得灵活,因为它允许用户选择选项或将输入发送到脚本。 不需要经常更改脚本,因为在某些情况下,只需更改参数值。

Cmdlet、函数和脚本都接受参数。

声明和使用参数

若要声明参数,需使用关键字 Param 和一对括号:

Param()

在括号内,你可以定义参数,并用逗号分隔它们。 典型的参数声明可能如下所示:

# CreateFile.ps1
Param (
  $Path
)
New-Item $Path # Creates a new file at $Path.
Write-Host "File $Path was created"

脚本中有一个 $Path 参数,该参数稍后用于在脚本中创建文件。 脚本现在更灵活了。

使用参数

若要调用具有参数的脚本,需要提供名称和值。 假设上面的脚本称为 CreateFile.ps1。 可按以下方式对它进行命名:

./CreateFile.ps1 -Path './newfile.txt' # File ./newfile.txt was created.
./CreateFile.ps1 -Path './anotherfile.txt' # File ./anotherfile.txt was created.

由于使用了参数,因此如果想要为脚本文件起一个其他别的名字,无需更改该文件。

注意

在此特定脚本中使用参数可能作用不大,因为它仅调用 New-Item。 只要脚本包含几行代码,就可以从使用参数中受益。

改进参数

首次创建使用参数的脚本时,你可能会确切记得参数的用途以及对于它们而言合理的值。 随着时间的推移,你可能会忘记这些详细信息。 你可能还需要帮同事编写脚本。 这些情况的解决方法是明确的,这使得脚本的使用变得简单。 如果脚本传入了不合理的参数值,你还希望脚本尽早失败。 定义参数时,需要考虑以下事项:

  • 是否必需? 参数是可选的还是必需的?
  • 允许哪些值? 哪些值合理?
  • 它是否接受多种类型的值? 参数是否接受任何类型的值,如字符串、布尔值、整数和对象?
  • 参数能否依赖于默认值? 是否可以完全省略值并改为依赖于默认值?
  • 可以进一步改进用户体验吗? 是否可以通过提供帮助消息为用户提供更清楚的提示?

选择方法

默认情况下,所有参数都是可选的。 该默认值在某些情况下可能有效,但有时你需要用户提供参数值,并且这些值必须是合理的。 如果用户未向参数提供值,则脚本应退出,或告诉用户如何解决此问题。 最糟糕的情况是,脚本继续进行,并执行意外的操作。

你可以使用几种方法提高脚本的安全性。 你可以编写自定义代码来检查参数值。 或者使用修饰器来执行大致相同的操作。 让我们看看这两种方法。

  • 使用 If/Else。 使用 If/Else 构造,可以检查参数的值,然后确定要执行的操作。 下面是一个示例:

    Param(
       $Path
    )
    If (-Not $Path -eq '') {
       New-Item $Path
       Write-Host "File created at path $Path"
    } Else {
       Write-Error "Path cannot be empty"
    } 
    

    如果没有为 $Path 提供值,则脚本将运行 Write-Error

  • 使用 Parameter[] 修饰器。 更好的方法是使用 Parameter[] 修饰器,它所需的键入更少:

    Param(
       [Parameter(Mandatory)]
       $Path
    )
    New-Item $Path
    Write-Host "File created at path $Path"
    

    如果运行此脚本并省略 $Path 的值,则会出现一个提示该值缺失的对话框:

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    Path:
    

    可通过为用户提供帮助消息来改进此修饰器,用户在运行脚本时将看到该消息:

    [Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
    

    运行脚本时,你会收到一条消息,提示需要键入 !? 获取详细信息:

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    (Type !? for Help.)
    Path: !?  # You type !?
    Please provide a valid path  # Your Help message.
    
  • 分配类型。 例如,如果为参数分配类型,你可以指定该参数只接受字符串,而不接受布尔值。 这样,用户就知道了期望结果。 可以在参数前面加上类型(用括号括住),为该参数分配类型:

    Param(
       [string]$Path
    )
    

这三种方法并不互斥。 可以将它们组合起来,使脚本更安全。