我有一个函数,name
我想为其参数提供制表符补全,制表符补全值是在 中找到的文件名c:\temp
。除了使用 中的文件c:\temp
作为值之外,我还想添加其他制表符补全值。以下是函数
Function foo{
Param(
[ValidateSet([layoutNames], ErrorMessage = """{0}"" Is not a valid Layout name")]
$Name
)
$name
}
以及layoutNames
参数使用的类name
:
Class layoutNames : System.Management.Automation.IValidateSetValuesGenerator{
[string[]] GetValidValues(){
#return @((Get-ChildItem -path 'c:\temp' -File).BaseName, "valueFoo", "valueBar") #tab completetion only suggests "valueFoo" and "valueBar"
#return @("valueFoo", "valueBar", (Get-ChildItem -path 'c:\temp' -File).BaseName) #tab completetion only suggests "valueFoo" and "valueBar"
return @( #tab completetion suggests "valueFoo" and "valueBar" and the file names.
"valueFoo", "valueBar"
(Get-ChildItem -path 'c:\temp' -File).BaseName
)
}}
对于上述内容,只有第三个return
示例有效,唯一的区别是新行......我认为。
我花了很长时间试图弄清楚这一点,我最初从一个如下所示的返回语句开始:
return [string[]]("valueFoo", "valueBar", (Get-ChildItem -path 'c:\temp' -File).BaseName)
但由于没有任何效果,所以我不断地进行修改,直到最终通过使用数组运算符来实现@()
。
我的问题的关键是,为什么当以以下方式声明时,该类不能按预期与函数一起工作foo
,即建议同时使用valueFoo
和valueBar
文件名c:\temp
Class layoutNames : System.Management.Automation.IValidateSetValuesGenerator{
[string[]] GetValidValues(){
#return [string[]]("valueFoo", "valueBar",(Get-ChildItem -path 'C:\Users\INDESK\AppData\Roaming\GPSoftware\Directory Opus\Layouts' -File).BaseName) # no files names are suggested. only 'valueFoo' and 'valueBar' are suggested
#return [string[]]("valueFoo", "valueBar",((Get-ChildItem -path 'C:\Users\INDESK\AppData\Roaming\GPSoftware\Directory Opus\Layouts' -File).BaseName)) # no files names are suggested. only 'valueFoo' and 'valueBar' are suggested
return [string[]](((Get-ChildItem -path 'C:\Users\INDESK\AppData\Roaming\GPSoftware\Directory Opus\Layouts' -File).BaseName),"valueFoo", "valueBar") # no files names are suggested. only 'valueFoo' and 'valueBar' are suggested
}}
我在 pwsh 7.4/win11 上
第三个示例之所以有效,是因为表达式前没有逗号
Get-ChildItem
。请参阅逗号运算符,
详细信息:这就像做:
如果将所有表达式放在一行中,那么在
Get-ChildItem
输出 2 个或更多项目时,本质上就存在创建锯齿状数组的风险:如果它不返回任何项目,那么您最终会得到一个
null
元素:如果您使用数组子表达式运算符
@( )
并希望将所有元素放在一行中,那么最好的办法就是使用它;
作为项目分隔符(表示新行/新语句):补充一下Santiagio 的有用答案:
避免无意中创建交错数组的另一种选择是通过运算符使用数组连接
+
:+
类似于数组(PowerShell 会在管道中自动枚举的数组或类似数据类型),则 RHS 会“附加”到数组:+
“添加”两个平面数组会产生另一个平面数组。因此,您可以执行以下操作:
请注意,也许令人惊讶的是,
,
(数组构造函数运算符)的优先级高于 ,因此 LHS 数组()不需要包含在分组运算符中。+
'valueFoo', 'valueBar'
(...)