【问题标题】:PowerShell - Multiple Get-Date calls return different time formats / culturesPowerShell - 多个 Get-Date 调用返回不同的时间格式/文化
【发布时间】: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


【解决方案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

但是你也可以用任何你想要的方式来格式化它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2011-09-19
    • 1970-01-01
    • 2020-12-26
    • 2011-03-14
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多