4
[DBG]: PS C:\Windows\system32>>> echo [uint32]::maxvalue
[uint32]::maxvalue

[DBG]: PS C:\Windows\system32>>> $mv = [uint32]::maxvalue
[DBG]: PS C:\Windows\system32>>> echo $mv
4294967295

我确信 powershell 有一些非常好的理由这样做:-)。有什么办法我可以告诉它不要这样做。我实际上将和 int 传递给一个函数,有时我想传递 maxvalue

我知道我能做到

$mv = [uint32]::maxvalue
MyFunc $mv

我想知道是否有类似的东西

MyFunc ([uint32]::maxvalue)
MyFunc `[uint32::maxvalue`

ETC

4

2 回答 2

5

原因是该echo命令将参数解释为 astring而不是任意值。因此,在第一个示例中,它按字面意思打印出参数,而不是将其解释为一个值。在第二种情况下,尽管它被解释为表达式并被分配给一个值。

您可以通过自己创建一个将输出回显到控制台的函数来重现此行为。

function example { 
  param ([string]$arg)
  Write-Output $arg
}

example [uint]
> [uint]
example 42
> 42

您还可以强制echo函数将其解释为值,方法是使用()s 指定它是一个表达式

echo [uint32]::maxvalue
> [uint32]::maxvalue
echo ([uint32]::maxvalue)
> 4294967295
于 2012-07-13T17:48:14.577 回答
3

PowerShell 在解释命令时使用两种模式,参数模式和表达式模式(请参阅 about_Parsing 主题)。

以下是在表达式模式下解析的,这就是您获取值的原因。

$mv = [uint32]::maxvalue
echo $mv

在 Argument 模式下,所有内容都被视为字符串,除非它以下列字符之一开头:$,@,',",(

echo [uint32]::maxvalue

参数 (-InputObject) 被解析为字符串并逐字回显。要评估它,您需要强制将其识别为表达式,将其括在括号中即可:

echo ([uint32]::maxvalue)
4294967295
于 2012-07-14T11:41:39.777 回答