在PowerShell脚本中,是否可以判断是否正在使用默认参数值?

在PowerShell脚本中,是否可以判断是否正在使用默认参数值?,powershell,Powershell,假设我有一个带有一个参数的简单脚本,它有一个默认值: param( [string] $logOutput = "C:\SomeFolder\File.txt" ) # Script... 假设用户按如下方式运行脚本: PS C:\> .\MyScript.ps1 -logOutput "C:\SomeFolder\File.txt" 脚本是否能够知道用户显式输入了一个值(恰好与默认值相同),而不是让默认值自动确定 在本例中,脚本将向给定文件打印一些输出。如果用户未指定文件(即

假设我有一个带有一个参数的简单脚本,它有一个默认值:

param(
    [string] $logOutput = "C:\SomeFolder\File.txt"
)
# Script...
假设用户按如下方式运行脚本:

PS C:\> .\MyScript.ps1 -logOutput "C:\SomeFolder\File.txt"
脚本是否能够知道用户显式输入了一个值(恰好与默认值相同),而不是让默认值自动确定


在本例中,脚本将向给定文件打印一些输出。如果用户未指定文件(即自动使用默认文件),则脚本在无法写入该位置时不会产生错误,只会静默进行。但是,如果用户确实指定了位置,并且脚本无法写入该位置,那么它将产生错误并停止,并警告用户。我如何实现这种逻辑?

这对您有用吗

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将被设置为默认值。

当您有默认值时,判断参数是否已指定的最简单方法是查看$PSBoundParameters。例如:

if ($PSBoundParameters.ContainsKey('LogPath')) {
    # User specified -LogPath 
} else {
    # User did not specify -LogPath
}

这是最简单的解决方案,完全符合需要!