【发布时间】:2020-08-19 07:36:06
【问题描述】:
我目前正在研究一个 powershell 脚本,我需要测量脚本执行开始和结束之间的持续时间。搜索了一段时间后,我决定使用这种方法:https://stackoverflow.com/a/61432373/11425760 我有一个 Get-Date 调用来获取脚本执行开始时的开始时间,另一个 Get-Date 调用正好在脚本执行即将结束之前:
$StartTime = Get-Date
# Script logic...
$EndTime = Get-Date
$Duration = New-TimeSpan -Start $StartTime -End $EndTime
$Day = switch ($Duration.Days)
{
0 { $null; break }
1 { "{0} day," -f $Duration.Days; break }
Default {"{0} days," -f $Duration.Days}
}
$Hour = switch ($Duration.Hours)
{
#0 { $null; break }
1 { "{0} hour," -f $Duration.Hours; break }
Default { "{0} hours," -f $Duration.Hours }
}
$Minute = switch ($Duration.Minutes)
{
#0 { $null; break }
1 { "{0} minute," -f $Duration.Minutes; break }
Default { "{0} minutes," -f $Duration.Minutes }
}
$Second = switch ($Duration.Seconds)
{
#0 { $null; break }
1 { "{0} second" -f $Duration.Seconds; break }
Default { "{0} seconds" -f $Duration.Seconds }
}
Write-Host "The script execution took: $Day $Hour $Minute $Second"
Write-Host "Script execution ended"
虽然当我实现它时这似乎工作正常,但我突然开始遇到一个问题,由于某种原因我在调用 New-TimeSpan 时收到“ParameterBindingException”,告诉我“End”参数的值(例如"08/19/2020 08:54:51") 无法转换为 System.DateTime 类型。然后,当我查看我提供的开始时间和结束时间时,尽管它们都来自 Get-Date 调用,但它们都以不同的格式打印。例如,end time 打印为
"08/19/2020 08:54:51"
和start time 一样
"Mittwoch, 19. August 2020 08:54:08"
(德语格式)。这似乎只在我第一次运行脚本时发生,因为一旦我再次运行它,错误就不再发生了。我不明白的是:在检查了开始时间和结束时间之后,开始时间(如预期的那样)是一个 DateTime 对象,但结束时间只是一个字符串,尽管这两个值都来自 Get-Date 调用。为什么会发生这种情况?如何避免遇到这个问题(或类似问题)?
【问题讨论】:
-
您是否尝试过创建具有定义格式的文化对象并一直使用它?像这样:
$en = New-Object system.globalization.cultureinfo(“en-US”)所以你可以运行它来获取这个文化的日期Get-Date -Format ($en.DateTimeFormat.FullDateTimePattern) -
@Kluk 不,我没有,但我也没有在脚本执行期间改变任何关于文化的东西,所以对我来说,为什么我在调用 Get-Date 时突然得到一些不同的东西是没有意义的。我也刚刚注意到,当问题发生时,开始时间是一个 DateTime 对象,而结束时间实际上只是一个字符串,尽管它们都来自 Get-Date 调用。
-
您确定这些 Get-Date 是在同一系统上执行的吗?不在远程服务器上或
Invoke-Command或类似的东西上?如果你运行Get-Culture,你只得到一种格式吗?也许您可以向我们展示导致此问题的代码。 -
以上内容对我来说非常有效,您能否确认以上内容是否是您的完整脚本?我假设您有一些额外的逻辑
# Script logic...是哪里?您是否有可能使用非常相似命名的变量? (可能正在使用.tostring()方法等将其转换为字符串类型?) -
我认为您不能将不同的类型重新分配给这样的变量。最好先清除或删除它。您可以使用
Clear-Variable删除变量中的数据或使用Remove-Variable删除数据和变量本身。示例:Remove-Variable -Name 'EndTime'(无 $ 符号)
标签: powershell datetime culture