2016-04-14 5 views
0

Je suis un peu étonné de voir comment PowerShell traite une chaîne qui représente un DateTime en termes de paramètres. Mon script a une définition de paramètres comme suit:L'analyse syntaxique des paramètres DateTime a des paramètres régionaux différents

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

Je veux entrer la date suivante: 1. Avril 2016, comme ma chaîne locale 01.04.2016. Maintenant PowerShell fait quelque chose qui est inattendu (au moins pour moi):

  1. J'entre la chaîne 01.04.2016 à l'invite de commande lorsque PowerShell interroge le paramètre obligatoire manquant. Ensuite, il s'analysé au 1er Avril 2016.
  2. J'entre la même chaîne 01.04.2016 directement à la ligne de commande comme celui-ci ZippenUndMailen.ps1 -von '01.04.2016' et maintenant PowerShell analyse la chaîne en utilisant la notation des États-Unis en Janvier 2016. 4ème

J'ai J'ai deux questions:

  1. Pourquoi PowerShell analyse-t-il différemment les chaînes?
  2. Comment remédier au mieux à ce problème? Le script doit être réutilisé et appelé à la fois manuellement et via TaskScheduler et ce comportement est plutôt contre-intuitif.

Répondre

2

Je ne peux pas reproduire aussi, malgré ma culture actuelle étant différente de en-us. Essayez de supprimer [DateTime] cast de votre définition de paramètre (réglez-le sur [Parameter(Mandatory=$true, ParameterSetName='Kunde')]$von) et utilisez $von = [DateTime]::Parse($von, (Get-Culture)) dans votre code pour forcer PS à utiliser votre culture actuelle.

More info:

Pour éviter subtils problèmes d'internationalisation de sauter dans vos scripts, PowerShell traite [DateTime] '11/26/2007' (une constante de date) comme une fonctionnalité de langage - comme il le fait [Double] 10.5 (une numérique constante.) Toutes les cultures n'utilisent pas le point décimal comme séparateur des fractions , mais les langages de programmation le standardisent. Toutes les cultures utilisent le format DateTime en-US, ce qui entraîne des millions de bogues d'internationalisation lorsque les gens ne considèrent pas l'impact de ayant leur logiciel exécuté dans ces cultures.

+0

Cela a résolu le problème. Il suffit de supprimer la définition explicite '[string]' dans la définition param. Autrement, PS ne ferait que convertir le 'DateTime' analysé en un' string'. Sans le type de données explicite, cela fonctionne très bien et est converti en 'DateTime'. – Adwaenyth

0

Adwaenyth, je ne peux pas reproduire la résolution temporelle différente que vous voyez, mais il est le plus probablement d'un problème de culture ... voir cette question concernant l'utilisation de la culture dans Powershell How to set culture in PowerShell?