【问题标题】:PowerShell Get-Date Does Not Evaluate Properly in StringPowerShell Get-Date 无法正确评估字符串
【发布时间】:2021-06-27 18:33:09
【问题描述】:

我的脚本需要一些时间,所以我在不同的地方做一个写主机只是为了显示进度。我只想有时间,但是当我将 Get-Date -DisplayHint Time 添加到字符串时,它会输出日期和时间(也是 24 小时格式)。

如果我在提示符下运行 Get-Date -DisplayHint Time,它工作正常。如果我把它放在脚本中单独的行,它就可以正常工作。

我试过了:

Write-Host "Starting Script at $(Get-Date -DisplayHint Time)"
Output:
Starting Script at 03/30/2021 14:56:20

我试过了:

$runTime = Get-Date -DisplayHint Time
$runTime
Write-Host "Starting Script @ $runTime"
Output:
11:01:09 AM
Starting Script @ 03/31/2021 11:01:09

就它自己而言:

Get-Date -DisplayHint Time
Output:
10:49:24 AM

什么给了?

---编辑--- 也只是尝试将时间转换为这样的字符串:

(Get-Date).ToString('h:mm:ss')
$runTime = (Get-Date).ToString('h:mm:ss')
$runTime
$runTime.GetType()
Write-Host ''
Write-Host "Starting Script @ $((Get-Date).ToString('h:mm:ss'))"
Write-Host "Starting Script @ $runTime"
Output:
11:12:40
11:12:40

IsPublic IsSerial Name           BaseType
-------- -------- ----           --------
True     True     String         System.Object

Starting Script @ 11:12:40
Starting Script @ 11:12:40

那么如果 $runTime 现在是一个字符串,为什么它会在 Write-Host 中运行?

【问题讨论】:

  • 为什么Write-Host中不显示字符串?
  • 也许我不明白你的问题;您是否要求仅时间输出:Get-Date -Format 'HH:mm:ss'
  • 试试Write-Host "Starting Script @ $($runTime.DateTime)"

标签: string powershell


【解决方案1】:

您需要将datetime 对象转换为字符串才能正确显示。

我个人从来没有发现Write-Host 有用,对于您在这里的特定目的,根本不需要。这当然是可以讨论的,我根本没有兴趣讨论这个。

如果您有兴趣详细了解它何时有用(如果有的话),我鼓励您阅读以下内容: Write-Host vs Write-Information in PowerShell 5

有更多相关文章,其中一些显示何时有用,我能找到的唯一示例是当您想在屏幕上显示颜色时:)

PS /~>  $runTime = Get-Date -DisplayHint Time

PS /~>  $runTime

3:45:49 PM

PS /~>  $runTime.ToString('h:mm:ss tt')
3:45:49 PM

PS /~>  $runTime.addhours(-5).ToString('h:mm:ss tt')
10:45:49 AM

PS /~>  "Starting Script @ $($runTime.ToString('h:mm:ss tt'))"
Starting Script @ 3:45:49 PM

PS /~>  "Starting Script @ {0}" -f $runTime.ToString('h:mm:ss tt')
Starting Script @ 3:45:49 PM

# Edit: Adding a few more examples

PS /~> "Starting Script @ {0:h:mm:ss tt}" -f $runTime
Starting Script @ 3:45:49 PM

PS /~> $runTime = (Get-Date).ToString('h:mm:ss tt')

PS /~> "Starting Script @ $runTime"
Starting Script @ 4:18:36 PM

PS /~> $runTime = [datetime]::Now.ToString('h:mm:ss tt')

PS /~> "Starting Script @ $runTime"
Starting Script @ 4:18:36 PM

【讨论】:

  • 使用 Write-Host 还不错。就像任何工具一样,它有它的位置。
  • @DougMaurer 是的。它写入一个完全不同的流(如果您使用的是 v5 或更高版本,在此之前无法捕获它)。 Powershell 仍然不允许重定向错误流以外的流。如果您要输出某些内容,则它需要作为输出流上的对象。 'Write-Host' 是一个多余的 cmdlet,一开始就不应该提供。对于详细、输出和调试流,Write-Host 没有任何用途。它仍然存在是为了向后兼容,但应该被遗忘。
  • 我个人从未发现Write-Host 有用,但每个人都可以有自己的看法。我在Write-Host 中看到的唯一用处是那些想要在屏幕上显示漂亮颜色的人...
  • 好的,您是说将字符串单独放在没有cmdlet 的行上。正确的?所以我缺少的是字符串本身中的 ToString。将其转换为 $runTime 变量是不够的。我有这个权利吗?
  • @WinArchitect 是的,只要将日期时间对象转换为字符串,您就可以这样做。顺便说一句,我看到您已经正确地使用了'h:mm:ss' 而不是'h:mm:ss tt' 用于上午/下午。查看我的编辑,还有更多关于如何做同样事情的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多