如何在PowerShell中隐藏参数以获取帮助(而不仅仅是选项卡完成)?
我四处搜索,找不到“不”的直接答案,也找不到“是”的直接答案 我已经知道:如何在PowerShell中隐藏参数以获取帮助(而不仅仅是选项卡完成)?,powershell,powershell-core,Powershell,Powershell Core,我四处搜索,找不到“不”的直接答案,也找不到“是”的直接答案 我已经知道: [参数(DontShow)]仅影响选项卡完成 是使用一个公共参数并在$PSBoundParameters中测试它的存在性-虽然在技术上可行,但它的副作用是没有我想要的名称 另一个建议是将其作为别名隐藏在另一个参数中,但这更适合弃用 我的场景中有一个参数,任何第三方都不应该使用它,而是由配套脚本使用 例如: [CmdletBinding(SupportsShouldProcess)]param( [switch]$
仅影响选项卡完成[参数(DontShow)]
- 是使用一个公共参数并在
中测试它的存在性-虽然在技术上可行,但它的副作用是没有我想要的名称$PSBoundParameters
- 另一个建议是将其作为别名隐藏在另一个参数中,但这更适合弃用
[CmdletBinding(SupportsShouldProcess)]param(
[switch]$VisibleSwitch,
[switch]$HiddenSwitch ### This switch should not be visible to human-beings.
)
#...
if( $HiddenSwitch) {
#do something
return
}
#...
我担心从PowerShell 7.2开始,没有好的解决方案,但是您想要的最接近的解决方案可能是:
- 定义一个代理参数,其名称表示不直接使用该参数
- 使用剩余参数的
和DontShow
属性声明此参数值
- 手动检查绑定到代理参数的参数以查找“隐藏”参数
- 这不会阻止代理参数显示在语法图中(例如使用
)-它将显示为-?
-但它不会显示真实的参数名称[-(忽略)]
- 在不再显示过时(不推荐)参数的情况下,要求提供一种从语法图中隐藏参数的官方方法
- 严格地说,您还必须检查
语法(很少使用)是否允许显式地将布尔值传递给开关(例如,${(ignore)}
),但为了简洁起见,我在上面的代码中省略了这一点-HiddenSwitch:$true
- 类似地,需要做更多的工作来支持传递隐藏参数名称的明确前缀(例如,
)-hidden
如果语法图中没有显示额外的参数是最重要的,那么一个次优的替代方法是使用一个名称不清楚的“private”变量,比如
$\uu HiddenSwitch
,调用者必须设置该变量才能模拟-HiddenSwitch
参数,而被调用者(脚本/函数)必须使用该变量检查后删除
请注意,如果被调用方是在模块中定义的,则需要额外的努力才能访问调用方的作用域。我担心自PowerShell 7.2起没有好的解决方案,但您想要的最接近的解决方案可能是:
- 定义一个代理参数,其名称表示不直接使用该参数
- 使用剩余参数的
和DontShow
属性声明此参数值
- 手动检查绑定到代理参数的参数以查找“隐藏”参数
- 这不会阻止代理参数显示在语法图中(例如使用
)-它将显示为-?
-但它不会显示真实的参数名称[-(忽略)]
- 在不再显示过时(不推荐)参数的情况下,要求提供一种从语法图中隐藏参数的官方方法
- 严格地说,您还必须检查
语法(很少使用)是否允许显式地将布尔值传递给开关(例如,${(ignore)}
),但为了简洁起见,我在上面的代码中省略了这一点-HiddenSwitch:$true
- 类似地,需要做更多的工作来支持传递隐藏参数名称的明确前缀(例如,
)-hidden
如果语法图中没有显示额外的参数是最重要的,那么一个次优的替代方法是使用一个名称不清楚的“private”变量,比如
$\uu HiddenSwitch
,调用者必须设置该变量才能模拟-HiddenSwitch
参数,而被调用者(脚本/函数)必须使用该变量检查后删除
请注意,如果被调用方是在模块中定义的,那么访问调用方的作用域需要付出额外的努力。下面是另一种可能的方法,如果从命令行调用函数,则会忽略额外的参数
Function Test-Parm {
Param (
[Parameter(Mandatory=$True)]
[Int] $Value,
[Parameter(Mandatory=$False)]
[String] $FromCode
)
$Calledby = $($MyInvocation).ScriptName
If ($CalledBy.Length -eq 0) {
"Called from Command Line"
}
Else { "Called from Code" }
}
结果:
PSv7>..\Test\Test-HideParam.ps1
Called from Code
PSv7>Test-Parm -Value 3 -FromCode "NO"
Called from Command Line
PSv7>
HTH这里是另一种可能的方法,如果从命令行调用该函数,则会忽略额外的参数
Function Test-Parm {
Param (
[Parameter(Mandatory=$True)]
[Int] $Value,
[Parameter(Mandatory=$False)]
[String] $FromCode
)
$Calledby = $($MyInvocation).ScriptName
If ($CalledBy.Length -eq 0) {
"Called from Command Line"
}
Else { "Called from Code" }
}
结果:
PSv7>..\Test\Test-HideParam.ps1
Called from Code
PSv7>Test-Parm -Value 3 -FromCode "NO"
Called from Command Line
PSv7>
HTH不是我要求的,而是将添加到我的模式库中。谢谢这不是我想要的,但会添加到我的模式库中。谢谢谢谢@mklement0!特别是对于GitHub问题和建议解决方案的详细演练(感谢要添加的打字错误修复,我已经有了RemainingArguments参数中的
值,所以我最好使用它-这种方式甚至不是(忽略)
将出现。很高兴听到它有帮助,@Lockszmith;我的荣幸。ReValuefrom RemainingArguments
参数:非常有意义。感谢@mklement0!特别是关于GitHub问题和建议解决方案的详细介绍(感谢您添加的排版修复,我已经有了一个ValueFromRemainingArguments
参数,所以我最好使用它-这样即使是(忽略)
也不会出现。很高兴听到它有帮助,@locksmith;我的荣幸。ReValueFromRemainingArguments
参数:意义非凡。