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 Get-Date

Powershell Get-Date 格式不正确

Powershell计算时间间隔(New-TimeSpan)

PowerShell Get-Date 获取年月日时分秒#yyds干货盘点#

powershell入门

Powershell 替换 csv 对象