Dot-Net

Get-Date 轉換為字元串 vs ToString()

  • March 25, 2021

我對 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)

引用自:https://stackoverflow.com/questions/30538994