2017-09-08 1 views
1

Dans PowerShell, j'essaie de convertir une chaîne que j'ai sélectionnée à partir d'un fichier texte en une date afin que je puisse ajouter ou soustraire des jours, des heures et ainsi de suite. Le problème est que lorsque je tente de convertir la chaîne résultat à partir du fichier texte, je reçois l'erreur suivante:Erreur chaîne à date

Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime." 

At line:15 char:5 

+  [datetime]::ParseExact($SC4,'HH:mm:ss', $null) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : FormatException 

Le code:

Get-Content results2.txt | ForEach-Object{ 
$splitUp = $_ -split " " 
$SC=$splitUp[0] -split " " 
$SC2=$splitUp[1] -split " " 
$SC3=$SC + $SC2 
Write-Host -NoNewline $SC3 | Write-Output $SC4 
Write-Host $SC4 
$r=[datetime]::ParseExact($SC4,'dd/MM/yyyy HH:mm:ss', $null) 
echo $r 

}

Le fichier result2.txt , à partir de laquelle je lis, contient ce qui suit:

09/07/2017 16:35:56 - 2017-09-07 14:55:51,312 [342] 
09/07/2017 16:35:56 - 2017-09-07 14:55:51,312 [342] 
09/07/2017 16:35:56 - 2017-09-07 14:56:54,918 [305] 
09/07/2017 16:35:56 - 2017-09-07 14:58:36,133 [113] 

Répondre

1

Le problème est parce que $SC4 est une variable vide. Votre tentative de le remplir via un canal de sortie de Write-Host ne fonctionne pas (car Write-Host écrit dans la console et non dans le pipeline).

Cette partie entière complique les choses et peut simplement être enlevée. Cela fonctionne très bien dans mes tests:

Get-Content result2.txt | ForEach-Object { 
    $splitUp = $_ -split " " 
    $SC=$splitUp[0] -split " " 
    $SC2=$splitUp[1] -split " " 
    $SC3 = $SC + $SC2 
    $r=[datetime]::ParseExact($SC3,'dd/MM/yyyy HH:mm:ss', $null) 
    echo $r 
} 

est ici une solution plus courte qui utilise regex pour correspondre à la première date dans le fichier:

Get-Content result2.txt | ForEach-Object { 
    $Check = $_ -Match '^\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}(?= .*$)' 
    If ($Check) { $R=[datetime]::ParseExact($Matches[0],'dd/MM/yyyy HH:mm:ss', $null) } 
    Echo $R 
} 
+0

Merci! Maintenant ça marche. Je l'ai fait parce que si j'affiche $ SC3, il affiche la date sur une ligne et l'heure sur la suivante, donc j'ai pensé que cela interfèrerait avec le format requis par ParseExact. Merci encore! –

0

Autre méthode:

Get-Content "c:\temp\test.txt" | ForEach-Object { 
    [datetime]::ParseExact(($_ -split " - ")[0],'dd/MM/yyyy HH:mm:ss', $null) 
} 


#short version 
gc "c:\temp\test.txt" |%{[datetime]::ParseExact(($_ -split " - ")[0],'dd/MM/yyyy HH:mm:ss', $null)}