echo [uint32] :: maxvalue表示'uint32 :: maxvalue'而不是4294967295

时间:2012-07-13 17:40:29

标签: powershell

[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`

2 个答案:

答案 0 :(得分:5)

原因是echo命令将参数解释为string而不是任意值。因此,在第一个例子中,它从字面上打印出论据,而不是将其解释为一个值。在第二种情况下,虽然它被解释为表达式并被赋值给一个值。

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

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

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

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

echo [uint32]::maxvalue
> [uint32]::maxvalue
echo ([uint32]::maxvalue)
> 4294967295

答案 1 :(得分:3)

PowerShell在插入命令,参数模式和表达式模式时使用两种模式(参见about_Parsing主题)。

以下是在表达式模式下解析的,这就是你重新获得值的原因。

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

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

echo [uint32]::maxvalue

参数(-InputObject)被解析为字符串并按字面回显。要评估它,你需要强制它被识别为一个表达式,将它包含在parens中完成工作:

echo ([uint32]::maxvalue)
4294967295