PowerShell - 多个 Get-Date 调用返回不同的时间格式/文化
Posted
技术标签:
【中文标题】PowerShell - 多个 Get-Date 调用返回不同的时间格式/文化【英文标题】:PowerShell - Multiple Get-Date calls return different time formats / cultures 【发布时间】:2020-08-19 07:36:06 【问题描述】:我目前正在研究一个 powershell 脚本,我需要测量脚本执行开始和结束之间的持续时间。搜索了一段时间后,我决定使用这种方法:https://***.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'
(无 $ 符号)
【参考方案1】:
我建议放弃这种方法并改用秒表。
只需在执行开始时创建并启动秒表并在结束时停止它,您就有时间查看对象。
$stopwatch = [system.diagnostics.stopwatch]::StartNew()
$stopwatch.Stop()
$stopwatch
这将输出:
IsRunning Elapsed ElapsedMilliseconds ElapsedTicks
False 00:00:00.0009000 0 9000
或者你可以得到这个:
$stopwatch.Elapsed
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 1
Ticks : 16324
TotalDays : 1,88935185185185E-08
TotalHours : 4,53444444444444E-07
TotalMinutes : 2,72066666666667E-05
TotalSeconds : 0,0016324
TotalMilliseconds : 1,6324
但是你也可以用任何你想要的方式来格式化它。
【讨论】:
以上是关于PowerShell - 多个 Get-Date 调用返回不同的时间格式/文化的主要内容,如果未能解决你的问题,请参考以下文章
Powershell计算时间间隔(New-TimeSpan)