2016-04-14 7 views
0

Ich bin ein wenig verwirrt, wie PowerShell eine Zeichenfolge behandelt, die eine DateTime darstellt, wenn es auf Parameter ankommt. My Script hat einen Parameter Definition wie folgt:DateTime Parameteranalyse hat andere Ländereinstellung

[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 
) 

ich folgendes Datum eingeben möchten: 1. April 2016 als meine locale String 01.04.2016. Jetzt tut Powershell etwas, das unerwartet ist (zumindest für mich):

  1. ich die Zeichenfolge 01.04.2016 an der Eingabeaufforderung eingeben, wenn Powershell die fehlenden obligatorischen Parameter abfragt. Dann geht es weiter zum 1. April analysiert 2016.
  2. Ich betrete die gleiche Zeichenfolge 01.04.2016 direkt auf der Kommandozeile wie folgt ZippenUndMailen.ps1 -von '01.04.2016' und jetzt Powershell analysiert die Zeichenfolge mit der US-Notation als 4. Januar 2016.

Ich habe habe zwei Fragen:

  1. Warum parst PowerShell die Zeichenfolgen unterschiedlich?
  2. Wie behebe ich dieses Verhalten am besten? Das Skript sollte sowohl manuell als auch über TaskScheduler wiederverwendet und aufgerufen werden. Dieses Verhalten ist eher gegensätzlich.

Antwort

2

ich es nicht reproduzieren kann, Auch, trotz meiner aktuellen Kultur unterscheidet sich von en-us. Versuchen Sie, die [DateTime] Umwandlung aus Ihrer Parameterdefinition zu entfernen (setzen Sie sie auf [Parameter(Mandatory=$true, ParameterSetName='Kunde')]$von) und verwenden Sie $von = [DateTime]::Parse($von, (Get-Culture)) in Ihrem Code, um PS zu zwingen, Ihre aktuelle Kultur zu verwenden.

More info:

subtile Internationalisierung Themen aus in die popping Skripte zu verhindern, behandelt Powershell [DateTime] '11/26/2007' (ein Datum Konstante) wie eine Sprache-Funktion - genau so wie [Double] 10.5 (eine numerische konstant.) Nicht alle Kulturen verwenden den Dezimalpunkt als Brüche Separator, aber Programmiersprachen standardisieren darauf. Nicht alle Kulturen verwenden das en-US-DateTime-Format, was zu Millionen von Internationalisierungsfehlern führt, wenn Leute die Auswirkung von nicht berücksichtigen, wenn ihre Software in diesen Kulturen läuft.

+0

Das hat es irgendwie gelöst. Ich musste nur die explizite '[string]' Definition in der param Definition entfernen. Andernfalls würde PS die geparste 'DateTime' nur in eine' Zeichenkette' zurückkonvertieren. Ohne den expliziten Datentyp funktioniert es gut und wird in eine 'DateTime' konvertiert. – Adwaenyth

0

Adwaenyth, ich kann die unterschiedliche Zeitauflösung nicht replizieren Sie sehen werden, aber es ist sehr wahrscheinlich eine Kultur Problem ... sehen diese Frage bezüglich der Verwendung von Kultur in Powershell How to set culture in PowerShell?

Verwandte Themen