防止胁迫

时间:2015-06-11 16:40:28

标签: powershell powershell-v3.0

假设:

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

在第二种情况下,有没有办法防止强制,除了使它们成为明确的字符串(第一种情况)?

2 个答案:

答案 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

这里需要注意的重要事项:

  1. 填充适用于数字。我将参数输入更改为int[],这样如果您传递字符串,它们将转换为数字,填充也适用于它们。

  2. 这种方法(就像现在一样)将你限制在我之前提到的id的范围内,它总是会给你四个零填充的输出,即使你通过了它[003'