我对PowerShell的字符串嵌入语法"$($object)"
的理解一直是,$object
被强制转换为[System.String]
,从而调用$object.ToString()
。然而,我在Windows 8.1上使用PowerShell 4.0时注意到了[DateTime]
类的奇怪行为。
PS> $x = Get-Date
PS> $x.GetType() | select -ExpandProperty Name
DateTime
PS> $x.ToString()
2015-05-29 13:36:06
PS> [String]$x
05/29/2015 13:36:06
PS> "$($x)"
05/29/2015 13:36:06
似乎"$($object)"
的行为与强制转换为字符串相同,但显然与$object.ToString()
产生不同的结果。$x.ToString()
与intl.cpl中设置的短日期格式一致(yyyy-MM-dd)。[String]$x
似乎使用en-US默认格式。
这可能只是DateTime类中的一个bug,但我更惊讶于将对象转换为字符串的不同方法会产生不同的结果。如果不是调用ToString()
,则将对象转换为字符串的规则是什么?DateTime类是否只是由于其ToString(String)
的重载而是一个特例?
.ToString()
并不总是产生与将对象嵌入字符串相同的结果(我还没有测试嵌入是否始终与转换为[String]
相同)。所以我只能说它不仅限于[DateTime]
。 - briantist.ToString()
方法接受格式参数,因此如果您需要一致性,请始终使用.ToString()
并提供所需的格式。与此同时,同意cast
应该只调用.ToString()
并接受其默认格式。不确定为什么他们会以其他方式实现它。 - johnjps111ToString()
则使用当前文化,正如文档所述。 - Ansgar WiechersGet-Culture
的输出是什么? - Matt Johnson-Pint$x.ToString()
得到了mm/dd/yyyy
格式。虽然我也得到了12小时制的时间,但是使用[String]$x
可以得到24小时制的时间。值得注意的是,从DateTime
转换为[String]
必须是PowerShell支持的内容,因为它对于C#或其他.NET语言无效。 - Matt Johnson-Pint