这些论坛非常棒,我希望能得到一些帮助,解决我在手动执行过程中遇到的头痛问题,而我发现,这个过程应该比自动化更容易。
我有一个来自供应商应用程序的命令行工具,它可以上传应用程序的日志。不过,该工具仅采用 Unix UTC 时间,我需要每天运行 3 到 4 次计划任务来上传应用程序日志。我可能只需上传当天的所有日志,但这仍然是一个问题,因为我不知道如何在脚本中做到这一点。所以我可以上传一整天的所有日志,而不必担心只上传最新的日志。
该命令位于我启动的 powershell 脚本中,如下所示,但如果使用批处理文件执行此操作更容易,我只是想避免添加类似 blat 的东西来发送电子邮件,而且我无法弄清楚如何在批处理脚本中获取任务结果,而这正是我需要在电子邮件中发送的。
下面的“IEX”是完整命令,我需要在其中填充当天的 UTC 时间,如果这比尝试获取上次运行计划任务的时间更容易,那么无论如何这都是最安全的选择。然后最后的“1 1”是供应商需要的参数,用于添加上传选项。
我如何填充日志上传的当前日期和时间?如果每天填充的时间是 12:01am (东部时间) 至 11:59pm (东部时间),应该没问题吧?
# "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)
}
答案1
要获取当前日期/时间作为 Unix 时间戳,请计算自开始以来经过的秒数unix 纪元:
$Now = [DateTime]::UtcNow
$Epoch = Get-Date -Year 1970 -Date 01/01
$unixTime = [int](New-TimeSpan $epoch $now).TotalSeconds
要查找两个特定的时间实例(示例中为前一天的 00:01 - 23:59):
$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")