如何在PowerShell中将字符串值转换为键入“ System.Int32”

问题描述

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

任何建议将不胜感激

$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)个实例,其结果报告为时间跨度,表示为[timespan] (System.TimeSpan)实例。

要使其正常工作,传递给-(减法)运算符的 个操作数必须为[datetime] 类型,在您的情况下您只需通过 casting [1] 将您的字符串操作数设为该类型即可(而不是调用Get-Date -Format 'MM/dd/yyyy',而应依次调用(Get-Date).Date直接返回[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

使用当前日期(不包含时间部分)作为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)接受的任何字符串,其中包括诸如'1/13/2020'之类的月份优先日期字符串以及诸如'2020-1-13' 之类的模棱两可的格式。 >