
Estos foros son fantásticos y espero recibir ayuda con el dolor de cabeza que tengo al realizar un proceso manualmente que debería ser más fácil de automatizar de lo que creo.
Tengo una herramienta de línea de comandos de una aplicación de proveedores que cargará registros para la aplicación. Sin embargo, la herramienta solo requiere tiempo UTC de Unix y necesito ejecutar la tarea programada de 3 a 4 veces al día para cargar los registros de la aplicación. Probablemente podría cargar todos los registros del día, pero eso sigue siendo un problema ya que no sé cómo hacerlo en un script. Entonces podría cargar todos los registros de todo el día y no preocuparme por cargar solo los registros más recientes.
El comando está en el script de PowerShell que comencé, que se encuentra a continuación, pero si es más fácil hacer esto con un archivo por lotes, solo estaba tratando de evitar agregar algo como blat para enviar el correo electrónico y tampoco pude entender cómo. para obtener el resultado de la tarea en un script por lotes, que es lo que necesito enviar por correo electrónico.
El "IEX" a continuación es el comando completo, y ahí es donde necesito completar la hora UTC del día. Si eso es más fácil que intentar obtener la hora de la última vez que se ejecutó la tarea programada, es la opción más segura de todos modos. Luego, el "1 1" al final son los parámetros que requiere el proveedor y que agregan opciones para la carga.
¿Cómo puedo completar el día y la hora actuales para la carga del registro? Si es la hora, como las 12:01 a. m. (este) a las 11:59 p. m. (este), la que se completa todos los días, ¿debería estar bien?
# "iex" is an alias for the invoke-expression cmd
iex c:\path_to_exe\myprog.exe -a 1379300570 1379300570 1 1
# $? lets us know if the previous command was successful or not
# $LASTEXITCODE gives us the exit code of the last Win32 exe execution
if (!$? -OR $LASTEXITCODE -gt 0)
{
$smtpServer = "smtp.mydomain.com"
$fromAddress = "[email protected]"
$toAddress = "[email protected]"
$subject = "FAILURE"
$msgBody = "Trouble with Task"
# Use these variables if auth for the SMTP server is required!
$senderCreds = new-object System.Net.networkCredential
$senderCreds.UserName = "senderusername"
$senderCreds.Password = "senderpwd"
$smtpClient = new-object Net.Mail.SmtpClient($smtpServer)
$smtpClient.Credentials = $senderCreds
$smtpClient.Send($fromAddress,$toAddress,$subject,$msgBody)
}
Respuesta1
Para obtener la fecha/hora actual como marca de tiempo de Unix, calcule el número de segundos transcurridos desde el inicio delépoca unix:
$Now = [DateTime]::UtcNow
$Epoch = Get-Date -Year 1970 -Date 01/01
$unixTime = [int](New-TimeSpan $epoch $now).TotalSeconds
Para encontrarlo para dos momentos específicos en el tiempo (00:01 - 23:59 del día anterior en el ejemplo):
$StartTime = (Get-Date "00:01:00").AddDays(-1)
$EndTime = (Get-Date "23:59:00").AddDays(-1)
$Epoch = Get-Date -Year 1970 -Date 01/01
$unixStart = [int](New-TimeSpan $epoch $StartTime).TotalSeconds
$unixEnd = [int](New-TimeSpan $epoch $EndTime).TotalSeconds
iex("c:\path_to_exe\myprog.exe -a $unixStart $unixEnd 1 1")