首先,我为发布有关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
。用引号括起第二组将纠正这一点,但这是一种监视此行为的方法。
答案 0 :(得分:2)
不,至少在2015年4月的Powershell 5.0预览中。选项卡完成按您的描述工作。它仍然需要集合周围的引号才能实际工作而不会抛出错误。对于它的价值,它会在您使用引号启动选项卡完成时添加匹配类型的结束引号。例如,按“f然后选项卡将完成”文件和打印“(不确定何时添加为功能)。
我试图找到自动包含引号作为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\'")]
答案 1 :(得分:1)
自2013年以来,这已作为错误输入。根据Auto-completed parameter values, with spaces, do not have quotes around them中列出的变通方法,您可以更新Powershell用于自动完成的TabExpansion2
函数。为此,只需运行以下代码:
function TabExpansion2
{
[CmdletBinding(DefaultParameterSetName = 'ScriptInputSet')]
Param(
[Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 0)]
[string] $inputScript,
[Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 1)]
[int] $cursorColumn,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 0)]
[System.Management.Automation.Language.Ast] $ast,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 1)]
[System.Management.Automation.Language.Token[]] $tokens,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 2)]
[System.Management.Automation.Language.IScriptPosition] $positionOfCursor,
[Parameter(ParameterSetName = 'ScriptInputSet', Position = 2)]
[Parameter(ParameterSetName = 'AstInputSet', Position = 3)]
[Hashtable] $options = $null
)
End
{
if ($psCmdlet.ParameterSetName -eq 'ScriptInputSet')
{
$completion = [System.Management.Automation.CommandCompletion]::CompleteInput(
$inputScript,
$cursorColumn,
$options)
}
else
{
$completion = [System.Management.Automation.CommandCompletion]::CompleteInput(
$ast,
$tokens,
$positionOfCursor,
$options)
}
$count = $completion.CompletionMatches.Count
for ($i = 0; $i -lt $count; $i++)
{
$result = $completion.CompletionMatches[$i]
if ($result.CompletionText -match '\s')
{
$completion.CompletionMatches[$i] = New-Object System.Management.Automation.CompletionResult(
"'$($result.CompletionText)'",
$result.ListItemText,
$result.ResultType,
$result.ToolTip
)
}
}
return $completion
}
}
值得注意的是,字符串插入适用于Get-EventLog -LogName
之类的本机cmdlet,它将正确包含'Internet Explorer'
。虽然Get-EventLog
$LogName
ValidateSet
,但您会看到boot
实际上并未使用index
,因此必须通过其他机制提供智能感知。
其他实例: