【问题标题】:DateTime parameter parsing has different localeDateTime 参数解析具有不同的语言环境
【发布时间】:2016-04-14 20:37:55
【问题描述】:

当涉及到参数时,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。然后将其解析为 2016 年 4 月 1 日。
  2. 我像 ZippenUndMailen.ps1 -von '01.04.2016' 这样直接在命令行中输入相同的字符串 01.04.2016,现在 PowerShell 使用美国符号 2016 年 1 月 4 日解析该字符串。

我有两个问题:

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

【问题讨论】:

    标签: parsing powershell datetime locale


    【解决方案1】:

    我也无法复制它,尽管我当前的文化与 en-us 不同。 尝试从您的参数定义中删除[DateTime] cast(将其设置为[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 格式,导致数百万 当人们不考虑影响时的国际化错误 让他们的软件在这些文化中运行。

    【讨论】:

    • 这有点解决了。只需删除参数定义中显式的[string] 定义。否则 PS 只会将解析后的 DateTime 转换回 string。如果没有显式数据类型,它可以正常工作并转换为DateTime
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2021-07-04
      相关资源
      最近更新 更多