假设:
Function Invoke-Foo {
Param(
[string[]]$Ids
)
Foreach ($Id in $Ids) {
Write-Host $Id
}
}
如果我这样做:
PS> Invoke-Foo -ids '0000','0001'
0000
0001
如果我这样做:
PS> Invoke-Foo -ids 0000,0001
0
1
在第二种情况下,有没有办法防止强制,除了使它们成为明确的字符串(第一种情况)?
答案 0 :(得分:3)
来自about_Parsing
帮助文件:
When processing a command, the Windows PowerShell parser operates in expression mode or in argument mode: - In expression mode, character string values must be contained in quotation marks. Numbers not enclosed in quotation marks are treated as numerical values (rather than as a series of characters). - In argument mode, each value is treated as an expandable string unless it begins with one of the following special characters: dollar sign ($), at sign (@), single quotation mark ('), double quotation mark ("), or an opening parenthesis (().
因此,解析器在将任何内容传递给函数之前评估0001
。我们可以使用0001
方法测试将ExpandString()
视为“可扩展字符串”的效果:
PS C:\> $ExecutionContext.InvokeCommand.ExpandString(0001)
1
答案 1 :(得分:3)
至少,如果您确定您的ID在[0,9999]范围内,您可以像这样进行格式化:
Function Invoke-Foo {
Param([int[]]$Ids)
Foreach ($Id in $Ids) {
Write-Host ([System.String]::Format("{0:D4}", $Id))
}
}
有关带前导零的填充数字的更多信息,请参见here。
这里需要注意的重要事项:
填充适用于数字。我将参数输入更改为int[]
,这样如果您传递字符串,它们将转换为数字,填充也适用于它们。
这种方法(就像现在一样)将你限制在我之前提到的id的范围内,它总是会给你四个零填充的输出,即使你通过了它[003'