首先,对于发布有关PowerShell和制表符完成的另一个问题,我深表歉意。 StackOverflow系统确定了几个很好的问题,并提供了与此主题相关的答案,但是它们似乎都太麻烦了,无法在此简单的New-ADComputer脚本中实现。

参数进入Splat以保持脚本可读。以下代码选项卡在ISE中正确完成,但必须用双引号引起来。

PowerShell中是否有任何本机方法允许制表符完成包含空格的参数集?

Param(
  [Parameter(Mandatory=$true)]
  [string]$Server,
  [Parameter(Mandatory=$true)]
  [ValidateSet('Env1','Env 2','Env 3')]
  [string]$Environment,
  [Parameter(Mandatory=$true)]
  [ValidateSet('Application','Database','File and Print','Web Server')]
  [string]$Type
)
$NewADitems = @{
  Name        = $server
  Path        = "OU=$Type,OU=$Environment,OU=Smaller DN string"
  Location    ='MySite'
  Description = "Test Description"
  ManagedBy   = "Huge Distingushed Name string"
  WhatIf      = $true
}
Write-Host @NewADitems

使用的命令和收到的错误:
PS C:\Scripts> .\ADComputer-ParamTest.ps1 -Server ThisTest -Environment Env 3 -Type File and Print
C:\Scripts\ADComputer-ParamTest.ps1 : Cannot validate argument on parameter
'Environment'. The argument "Env" does not belong to the set "Env1,Env 2,Env3"
specified by the ValidateSet attribute. Supply an argument that is in the
set and then try the command again.At line:1 char:58
+ .\ADComputer-ParamTest.ps1 -Server ThisTest -Environment Env 3 -Type File and Pr ...
+                                                          ~~~

编辑:更多信息。如果您在示例脚本中为参数Environment省略了单引号/双引号,则制表符补全将不适用于最终参数Type。用引号括起来的第二组将纠正此问题,但这是一种监视此行为的方法。

最佳答案

不,至少在Powershell 5.0 2015年4月之前可以预览。选项卡补全按您的描述工作。它仍然需要集合周围的引号才能真正起作用而不会引发错误。对于它的值(value),当您使用引号开始制表符完成时,确实会添加匹配类型的结束引号。例如,按“f,然后Tab将完成”文件和打印“(不确定何时将其添加为功能)。

我尝试寻找自动将引号作为ValidateSet的一部分的方法,包括在参数集周围使用附加的双引号以及其他尝试转义引号的方法。所有尝试导致制表符补全无法以各种方式工作。

一些尝试,以防万一有人尝试这种方法:

[ValidateSet('Env1','"Env 2"','"Env 3"')]
[ValidateSet('Env1',"'Env 2'","'Env 3'")]
[ValidateSet('Env1','`"Env 2`"',"`'Env 3`'")]
[ValidateSet('Env1','\"Env 2\"',"\'Env 3\'")]

07-24 09:51
查看更多