假设我有一个带有一个参数的简单脚本,它有一个默认值:
param(
[string] $logOutput = "C:\SomeFolder\File.txt"
)
# Script...
然后让用户像这样运行脚本:
PS C:\> .\MyScript.ps1 -logOutput "C:\SomeFolder\File.txt"
有没有办法让脚本能够知道用户明确输入了一个值(恰好与默认值相同),而不是自动决定默认值?
在此示例中,脚本将打印一些输出到给定文件。如果文件是不是由用户指定(即默认情况下自动使用),则脚本将不在无法写入的情况下产生错误位置,并将只是默默地进行。但是,如果用户 指定了位置,并且脚本无法写入该位置,那么它应该产生错误并停止,警告用户。我怎么能实现这种逻辑?
答案 0 :(得分:15)
当您有默认值时,判断参数是否被指定的最简单方法是查看$ PSBoundParameters。例如:
if ($PSBoundParameters.ContainsKey('LogPath')) {
# User specified -LogPath
} else {
# User did not specify -LogPath
}
答案 1 :(得分:1)
这对你有用吗?
function Test-Param
{
[CmdletBinding()]
param(
[ValidateScript({Try {$null | Set-Content $_ -ErrorAction Stop
Remove-Item $_
$True}
Catch {$False}
})]
[string] $logOutput = 'C:\SomeFolder\File.txt'
)
}
只有在无法使用-logOutput参数写入传入的文件位置时,验证脚本才会运行并抛出错误。如果未指定参数,则不会运行测试,并且$ logOutput将设置为默认值。