Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PowerShell中隐藏参数以获取帮助(而不仅仅是选项卡完成)?_Powershell_Powershell Core - Fatal编程技术网

如何在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;我的荣幸。Re
Valuefrom RemainingArguments
参数:非常有意义。感谢@mklement0!特别是关于GitHub问题和建议解决方案的详细介绍(感谢您添加的排版修复,我已经有了一个
ValueFromRemainingArguments
参数,所以我最好使用它-这样即使是
(忽略)
也不会出现。很高兴听到它有帮助,@locksmith;我的荣幸。Re
ValueFromRemainingArguments
参数:意义非凡。