首页 > 解决方案 > 如何在 PowerShell 中隐藏 Get-Help 中的参数(不仅仅是制表符完成)?

问题描述

我四处寻找,我找不到“不”的直接答案,但也找不到“是”的直接答案。

我已经知道的:

我的场景是有一个参数不应该被任何第 3 方使用,但被伴随脚本使用

例子:

[CmdletBinding(SupportsShouldProcess)]param(
  [switch]$VisibleSwitch,
  [switch]$HiddenSwitch ### This switch should not be visible to human-beings.
)
#...
if( $HiddenSwitch) {
  #do something
  return
}
#...

标签: powershellpowershell-core

解决方案


我担心从 PowerShell 7.2 开始没有好的解决方案,但是您想要的最接近的近似值可能如下:

  • 定义一个代理参数,其名称表明它不能直接使用。

  • DontShow使用和ValueFromRemainingArguments [Parameter()]属性声明此参数。

  • 手动检查绑定到代理参数的参数以查找“隐藏”参数。

[CmdletBinding(SupportsShouldProcess)]
param(
  [switch] $Switch
  ,
  [Parameter(DontShow, ValueFromRemainingArguments)]
  ${(ignore)}
)

# Examine the quasi-hidden parameter value 
# for containing the switch name of interest.
$HiddenSwitch = ${(ignore)}.Count -eq 1 -and ${(ignore)}[0] -eq '-HiddenSwitch'

# Make sure that no unexpected arguments were passed.
if (-not $HiddenSwitch -and ${(ignore)}.Count -gt 0) { throw "Unexpected arguments specified: ${(ignore)}"}

# Output what switches were passed.
[pscustomobject] @{
  '-Switch' = $Switch
  '-HiddenSwitch' = $HiddenSwitch
}

笔记:

  • 这不会阻止代理参数出现在语法图中(例如 with -?) - 它会显示为[-(ignore) <Object>]- 但它不会显示真正的参数名称。

    • GitHub 问题 #7868要求在不再显示过时(弃用)参数的情况下,以官方方式从语法图中隐藏参数。
  • 严格来说,您还必须检查${(ignore)}允许显式将布尔值传递给开关的(很少使用的)语法(例如,-HiddenSwitch:$true),但为了简洁起见,我在上面的代码中省略了它。

  • 类似地,需要更多的工作来支持传递隐藏参数名称的明确前缀(例如,-Hidden)。


如果在语法图中没有显示额外的参数是最重要的,那么 - 也是次优的 - 替代方法是使用具有晦涩名称的“私有”变量,例如$__HiddenSwitch,调用者必须设置它才能模拟-HiddenSwitch参数,并且被调用者(您的脚本/函数)在检查后将其删除。

请注意,如果被调用者是在模块中定义的,则需要额外的努力才能访问调用者的范围。


推荐阅读