DateTime参数解析具有不同的区域设置

时间:2016-04-14 07:21:13

标签: parsing powershell datetime locale

我对PowerShell如何处理表示DateTime的字符串有点困惑。我的脚本有一个参数定义如下:

[CmdletBinding(DefaultParameterSetName='Kunde')]
param(
    [Parameter(Mandatory=$true, ParameterSetName='Kunde')]
    [string]$KdNr,
    [Parameter(Mandatory=$true, ParameterSetName='Kunde')]
    [DateTime]$von,
    [Parameter(Mandatory=$true, ParameterSetName='Kunde')]
    [DateTime]$bis,
    [Parameter(Mandatory=$true, ParameterSetName='Kunde')]
    [string]$Empfaenger
)

我想输入以下日期:1。2016年4月作为我的语言环境字符串01.04.2016。现在PowerShell做了一些意想不到的事情(至少对我来说):

  1. 当PowerShell查询缺少的必需参数时,我在命令提示符处输入字符串01.04.2016。然后它将被解析为1. 2016年4月。
  2. 我直接在命令行输入相同的字符串01.04.2016,就像这个ZippenUndMailen.ps1 -von '01.04.2016'一样,现在PowerShell使用美国符号解析字符串为2016年1月4日。
  3. 我有两个问题:

    1. 为什么PowerShell以不同的方式解析字符串?
    2. 我如何最好地纠正这种行为?脚本应该被重用并手动和通过TaskScheduler调用,这种行为相当直观。

2 个答案:

答案 0 :(得分:3)

尽管我目前的文化与en-us不同,但我也无法复制它。 尝试从参数定义中删除[DateTime]强制转换(将其设置为[Parameter(Mandatory=$true, ParameterSetName='Kunde')]$von)并在代码中使用$von = [DateTime]::Parse($von, (Get-Culture))以强制PS使用您当前的文化。

More info

  

防止微妙的国际化问题突然爆发   脚本,PowerShell处理[DateTime] '11/26/2007'(日期常量)   像语言功能一样 - 就像[Double] 10.5一样(数字   常量。)并非所有文化都使用小数点作为分数   分隔符,但编程语言标准化。不是全部   文化使用en-US DateTime格式,产生数百万   当人们不考虑影响时,国际化的缺陷   让他们的软件在这些文化中运行。

答案 1 :(得分:0)

Adwaenyth,我无法复制您所看到的不同时间分辨率,但很可能是文化问题......请参阅有关在Powershell中使用文化的问题How to set culture in PowerShell?