Dot-Net
Get-Date 轉換為字元串 vs ToString()
我對 PowerShell 的字元串嵌入語法的理解
"$($object)"一直$object是強制轉換為[System.String],它呼叫$object.ToString(). 但是,我注意到[DateTime]在 Windows 8.1 上使用 PowerShell 4.0 的類的這種奇怪行為。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 類中的一個錯誤,但我更驚訝的是,將對象轉換為字元串的不同方法會產生不同的結果。如果不呼叫,將對象轉換為字元串的規則是什麼
ToString()?DateTime 類是否只是一個特例,因為它的重載ToString(String)?
如果一個對象實現了該
IFormattable介面,那麼 PowerShell 將呼叫IFormattable.ToString而不是Object.ToString進行強制轉換操作。靜態方法也會發生類似的事情Parse:如果有IFormatProvider參數重載,那麼它將被呼叫。Add-Type -TypeDefinition @' using System; using System.Globalization; public class MyClass:IFormattable { public static MyClass Parse(string str) { return new MyClass{String=str}; } public static MyClass Parse(string str,IFormatProvider fp) { return new MyClass{String=str,FormatProvider=((CultureInfo)fp).DisplayName}; } public string String {get;private set;} public string FormatProvider {get;private set;} public override string ToString() { return "Object.ToString()"; } string IFormattable.ToString(string format,IFormatProvider fp) { return string.Format("IFormattable.ToString({0},{1})",format,((CultureInfo)fp).DisplayName); } } '@ [String](New-Object MyClass) #Call IFormattable.ToString(null,CultureInfo.InvariantCulture) [MyClass]'Test' #Call MyClass.Parse("Test",CultureInfo.InvariantCulture)