我在Powershell发生了一件非常奇怪的事情。
以下是代码:
add-pssnapin windows.serverbackup
$wbs = Get-Wbsummary
$lastbackuptime = $wbs.lastBackupTime
$solution = "Windows Server Backup"
$surl = "https://REDACTED:1338/REDACTED.asp?querysolution=$solution&querylastbackuptime=$lastbackuptime"
write-host $surl
write-host $lastbackuptime
这是我运行时输出的内容
https://REDACTED:1338/REDACTED.asp?querysolution=Windows Server Backup&querylastbackuptime=05/07/2013 05:04:12
07/05/2013 05:04:12
为什么powershell在作为另一个变量的一部分时交换日期而不是在我自己输出变量时?
答案 0 :(得分:3)
这是投射datetime
对象的特例。当您只使用write-host
将日期打印为字符串时,这将等于运行$lastbackuptime.toString()
。这种方法使用你的计算机文化。就我而言,Windows的Region设置中的文化是挪威,所以我得到了“欧洲”日期格式:dd/mm/yyyy
。
但是,当您在字符串中包含$lastbackuptime
时,它会对string
- 对象执行强制转换。在PowerShell(或.Net)中,决定在构建datetime-object时,它应该使用标准格式将其转换为字符串,以便无论计算机配置何种文化,代码都将运行相同。这就是为什么cast会为您提供美国格式,而toString()
和Write-Host
会提供“欧洲”格式
例如:
[16:07:43] PS-ADMIN C:\> $d.tostring()
07.05.2013 16:04:17
[16:13:05] PS-ADMIN C:\> write-host $d
07.05.2013 16:04:17
[16:13:12] PS-ADMIN C:\> [string]$d
05/07/2013 16:04:17
要指定日期时间应显示的格式,您可以执行以下操作:
[16:14:28] PS-ADMIN C:\> $d.tostring("dd/MM/yyyy")
07.05.2013
[16:14:34] PS-ADMIN C:\> "examplestring $($d.tostring("dd/MM/yyyy"))"
examplestring 07.05.2013
了解更多here
答案 1 :(得分:0)
检查您的区域设置,特别是短日期&长日期格式。
在我的系统上,短日期为MM/dd/yyyy
,长日期为dddd, MMMM dd,yyyy
。然后,运行示例的简化版本:
>$lastbackuptime = get-date;
>$lastbackuptime
Tuesday, May 07, 2013 10:07:42
>$url="http://whatever/redacted.asp?time=$lastbackuptime";
>$url
http://whatever/redacted.asp?time=05/07/2013 10:07:42
当单独使用时,长日期格式用于返回日期,但是当与另一个字符串连接(或扩展内部)时,使用短日期格式。