如何在 PowerShell 中将字符串值转换为类型 "System.Int32"

How to convert a string value to type "System.Int32" in PowerShell

我试图计算两个日期之间的天数,但出现以下错误

如有任何建议,我们将不胜感激

$Days = $expiration - $currentDate
Cannot convert value "12/28/2020" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $Days = $expiration - $currentDate
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastFromStringToInteger

下面是一段代码供参考

$expiration = $QueryResults.Results.ExpiryDate_s
$expiration
12/28/2020

$currentDate = Get-Date -Format 'MM/dd/yyyy'
$currentDate
09/30/2020


$expiration.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                              
-------- -------- ----                                     --------                                                                                                                              
True     True     String                                   System.Object

$currentDate.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                              
-------- -------- ----                                     --------                                                                                                                              
True     True     String                                   System.Object

您正在尝试对不正确的日期时间数据类型值进行数学计算。

我相信您可以使用 New-TimeSpan cmdlet 来满足您的需求。像这样:

PS C:\WINDOWS\system32> New-TimeSpan -Start '01.01.2020' -End $(Get-Date)


Days              : 274
Hours             : 3
Minutes           : 38
Seconds           : 17
Milliseconds      : 295
Ticks             : 236866972950824
TotalDays         : 274,151589063454
TotalHours        : 6579,63813752289
TotalMinutes      : 394778,288251373
TotalSeconds      : 23686697,2950824
TotalMilliseconds : 23686697295,0824

您还可以调用日期时间数据类型变量的方法,例如AddDays()。像这样:

  PS C:\WINDOWS\system32> $CurrentDate = Get-Date
  PS C:\WINDOWS\system32> $CurrentDate.AddDays(-274)
    
    1 января 2020 г. 3:40:59

PowerShell直接支持减[datetime] (System.DateTime) instances, the result of which is reported as a span of time, expressed as a [timespan] (System.TimeSpan)实例。

为此,两个 传递给 -(减法)运算符的操作数必须是 [datetime][= 类型61=],在你的情况下,你可以简单地通过 casting[1] 将你的字符串操作数转换为该类型(而不是调用 Get-Date -Format 'MM/dd/yyyy' 您应该直接调用 (Get-Date).Date 以便 return 一个 [datetime] 实例):

PS> [datetime] '12/28/2020' - [datetime] '09/30/2020'

Days              : 89
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 76896000000000
TotalDays         : 89
TotalHours        : 2136
TotalMinutes      : 128160
TotalSeconds      : 7689600
TotalMilliseconds : 7689600000

要仅获取两个日期之间的天数,使用当前日期(没有 time-of-day 组件)作为 RHS:

$days = ([datetime] '12/28/2020' - (Get-Date).Date).Days

至于你试过的

如果将 string 类型的 LHS 传递给 - 运算符,PowerShell 会尝试将其解释为 数字.

由于'12/28/2020'等字符串无法解析为数值类型,所以操作失败。举个更明显的例子:

PS> 'I am not a number' - 1
Cannot convert value "I am not a number" to type "System.Int32"
...

[int] (System.Int32) 恰好是为错误消息选择的一种数字类型。


[1] 请注意,PowerShell 转换始终基于 不变文化 ,它基于美国英语文化,无论当前是什么文化有效。这意味着 [datetime] 转换接受 [datetime]::Parse($string, $null) 接受的任何字符串,其中包括 month-first 日期字符串,例如 '1/13/2020' 以及更明确的格式,例如 '2020-1-13'