参数
创建几个脚本后,你可能会注意到脚本并不灵活。 进入你的脚本以对其进行更改并不是那么有效。 有一种更好的方法来处理更改:使用参数。
使用参数可以使脚本变得灵活,因为它允许用户选择选项或将输入发送到脚本。 不需要经常更改脚本,因为在某些情况下,只需更改参数值。
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 )
这三种方法并不互斥。 可以将它们组合起来,使脚本更安全。