Estoy usando PowerShell con una secuencia de comandos para convertir un .CSV archivos de datos en bruto en más manejable formato de datos con columnas separadas, una visión más limpia etc. Y debido a que el archivo de origen con los datos en bruto que está en NOSOTROS formato de fecha y hora (por ejemplo, 11/23/21, 1:00 PM), entonces, si la PC está en que NOSOTROS mismos formato el proceso de conversión se ejecuta perfectamente como debe con 0 errores. PERO, si el PC es de un país diferente formato de fecha y hora, luego de PowerShell muestra los errores en rojo en el proceso.
Cuando el PC está en otro formato DateTime veo que el principal error es:
"Analizar" con "1" argumento(s): "la Cadena no fue reconocida como válida DateTime."
Y el problema es que la PC donde esta va a ser utilizado no está en NOSOTROS formato (sólo se ha cambiado a NOSOTROS formato para la prueba), así que ¿podría alguien por aquí que por favor me ayude a agregar al proceso de conversión, la sintaxis o frase/s simplemente especificar directamente en el código de un formato fijo que mantiene estático de un formato de salida de forma independiente sobre el PC reloj formato de fecha y hora, y si una de las entradas en el archivo "11/23/21, 1:00 PM", a continuación, especificar en el código que se desea que la salida en el formato "dd-MMM-aaaa hh:mm" para tener un resultado como el "23-Nov-2021 01:00 PM"
La sección de código en el script utilizado para la conversión es:
…
$data = $csvData | ? {$_ -match "\(DTRE"}
dtreFileData = New-Object System.Collections.Generic.List[PSCustomObject]
foreach ($item in $data)
{
$null = $item.Strategy -match "\(DTRE\|(.*)\)"
$v = $Matches[1] -split '\|'
$resultvalue = $v[0] | Convert-CurrencyStringToDecimal
$expectedvalue = $v[1] | Convert-CurrencyStringToDecimal
$dtreData = [PSCustomObject]@{
'DateTime' = ([datetime]::Parse($item.'Date/Time'))
'ResultValue' = [decimal]$resultvalue
'ExpectedValue' = [decimal]$expectedvalue
}
$null = $dtreFileData.Add($dtreData)
$null = $dtreAllData.Add($dtreData)
}
$dtreFileData | Export-Csv -Path (Join-Path (Split-Path -Path $f -Parent) ($outFile + '.csv')) -Force -NoTypeInformation -Encoding ASCII
…
Ejemplo de los datos de origen (en los archivos CVS son decenas de líneas como la siguiente):
...(DTRE|49.0|48.2);...;11/23/21, 12:58 PM...;
...(DTRE|52.1|52.0);...;11/23/21, 1:00 PM...;
...
...
Y se ve el resultado:
He probado con DateTime ejemplos en otros posts de aquí (stackoverflow.com para ajustar el código para que funcione en un PC sin NOSOTROS formato de fecha y hora y para obtener el formato DateTime resultado descrito anteriormente. Ejemplos como:
'DateTime' = ([datetime]::Parse($item.'yyyy-MM-dd:HH:mm:ss'))
'DateTime' = ([datetime]::ParseExact($item.'yyyy-MM-dd:HH:mm:ss'))
…
$culture = [Globalization.CultureInfo]::InvariantCulture
…
'DateTime' = ([datetime]::ParseExact($item.'yyyy-MM-dd:HH:mm:ss', $culture))
…
Pero con estos ejemplos PowerShell muestra el error "No se puede vincular el argumento del parámetro 'InputObject' porque es null"
Actualización después de la respuesta de @Seth:
Cuando se trata de la próxima modificación del código, con el PC de formato de fecha del sistema en "24-Nov-21" y dejando el resto como arriba:
…
$resultvalue = $v[0] | Convert-CurrencyStringToDecimal
$expectedvalue = $v[1] | Convert-CurrencyStringToDecimal
$cultureInfo= New-Object System.Globalization.CultureInfo("es-ES")
$dtreData = [PSCustomObject]@{
'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))
'ResultValue' = [decimal]$resultvalue
'ExpectedValue' = [decimal]$expectedvalue
…
dd-MMM-yyyy hh:mm
o , por ejemplo, a la cultura nombrees-ES
o algo similar", es decir, se especifican directamente en el código como un universal o genérico de manera que esto funciona sin importar si el PC está en inglés, formato de fecha y hora, o si la PC está en español, formato de fecha y hora, o si la PC está en francés formato de fecha y hora