Regardons comment diagnostiquer cela.
Le message d'erreur:
Cannot find an overload for "ConvertTime" and the argument count: "2".
est une commune sur PowerShell pour appeler des méthodes sur les objets. Parfois, c'est trompeur. Cela signifie toujours que, compte tenu des arguments que vous avez fournis, aucune des surcharges de la méthode ne correspond. A côté: chaque méthode a une ou plusieurs façons de l'appeler, avec des paramètres de différents types, ou des nombres ou des ordres de paramètres différents.
Dans PowerShell, vous pouvez voir toutes les surcharges en "invoquant" la méthode sans parenthèses ni arguments. Alors:
[System.TimeZoneInfo]::ConvertTime
Résultat:
OverloadDefinitions
-------------------
static System.DateTimeOffset ConvertTime(System.DateTimeOffset dateTimeOffset, System.TimeZoneInfo destinationTimeZone)
static datetime ConvertTime(datetime dateTime, System.TimeZoneInfo destinationTimeZone)
static datetime ConvertTime(datetime dateTime, System.TimeZoneInfo sourceTimeZone, System.TimeZoneInfo
destinationTimeZone)
Le message d'erreur dans PowerShell références toujours le nombre d'arguments, mais parfois signifie aussi que vous n'avez pas utilisé le type correct.
Donc, dans votre exemple, a fourni 2 arguments, ce qui rend l'erreur confuse.
Mais le deuxième argument que vous avez fourni est un [string]
. En regardant les surcharges disponibles, vous pouvez voir qu'aucun des deuxièmes arguments ne prend une chaîne, ils recherchent tous un objet de type [System.TimeZoneInfo]
.
Parfois, vous pouvez utiliser un type différent, s'il existe une distribution implicite disponible. Par exemple si une méthode prend un paramètre de type [System.Net.IPAddress]
alors vous pouvez donner une chaîne comme '127.0.0.1'
. C'est parce que [System.Net.IPAddress]
sait comment convertir une chaîne IP dans l'objet. Vous pouvez le voir en faisant quelque chose comme '127.0.0.1' -as [System.Net.IPAddress]
ou [System.Net.IPAddress]'127.0.0.1'
.Pour revenir à votre cas d'utilisation: il semble que vous ne pouvez pas convertir une chaîne au type TimeZoneInfo
, ou que votre chaîne n'est pas valide à cette fin (c'est-à-dire que la distribution a échoué).
Vous devriez donc d'abord comprendre comment créer ou récupérer un objet TimeZoneInfo
qui représente ce que vous voulez.
Il me semble que [System.TimeZoneInfo]::GetSystemTimeZones()
renvoie un tableau de tous les fuseaux horaires de votre système.
Filtrer cette liste pour trouver celle que vous voulez semble être une bonne idée. En regardant la liste, je peux voir la chaîne que vous souhaitez utiliser est dans la propriété StandardName
donc je vais l'utiliser pour obtenir le droit:
$gmt = [System.TimeZoneInfo]::GetSystemTimeZones().Where({$_.StandardName -eq 'GMT Standard Time'})[0] # it's an array, so get the first one
Ensuite, vous pouvez appeler votre méthode originale avec cet objet:
[System.TimeZoneInfo]::ConvertTime($test, $gmt)
Exactement ce que je cherchais, merci beaucoup !! – samsingla
@samsingla Je suis heureux d'avoir pu aider. N'hésitez pas à accepter la réponse comme une solution à votre problème si cela vous a aidé. – notjustme