Schedulering af SAS job i MS Task Scheduler, som sender e-mail med log og statuskode ved fejl Eksemplet består af 2 dele, et SAS program der fejler, samt et Powershell script til at eksekvere SASprogrammet og holde øje med returkoden. Er der en returkode større end 0 sendes der en E-mail med logfil. SAS programmet står i appendiks til dette dokument, hvis man har lidt svært ved at skrive et program, der fejler. (D:\Temp\Proc_DoesNotExist.sas) Powershell scriptet står ligeledes i appendiks (D:\Temp\Proc_DoesNotExist.ps1) og skal rettes til, så det passer til det miljø man vil eksekvere på. Parametrene der skal ændres er: $smtpserver = "[Name of SMTP-Server]" /*SMTP-server for outgoing mails*/ $mailto = "[E-mail address]" /*Who shall receive the mail*/ $mailfrom = "[E-mail sender]" /*Who is the email from */ $saspgm = 'D:\Temp\Proc_DoesNotExist.sas' /*The SAS program to execute*/ $logfolder = 'D:\Temp\' /*Where should the log be saved make a dir for that */ $sasexe = 'D:\Program Files\SASHome\SASFoundation\9.3\sas.exe' /*The location of SAS.exe*/ $sascfg = 'D:\Program Files\SASHome\SASFoundation\9.3\sasv9.cfg'; /*The location of SAS-config*/ $param = '-logparm "rollover=session" -noautoexec -sasuser work -batch -nologo -nodms -icon -errorabend' /*SAS parameters*/ Når man har fundet en SMTP-Server man kan sende fra og rettet de andre parametre til, er man klar til sætte en scheduled task op I Windows Task Scheduler: Vælg Create Task : Giv et sigende navn, samt angiv at det skal eksekveres selvom brugeren ikke er logget på ( Run whether user is logged on or not ):
På Triggers fanebladet vælges det mønster der skal scheduleres efter: På Actions fanebladet vælges new, og der vælges Start a program som action og sættes Powershell ind som kommando i Program/script. I arguments indsættes f.eks: -ExecutionPolicy ByPass -file "D:\Temp\Proc_DoesNotExist.ps1" -ExecutionPolicy ByPass er nødvendig for at måtte eksekvere powershell programmet (HMM). file peger på det program der skal eksekveres. I dette tilfælde, det powershell script, der afvikler SAS Programmet. Sæt hak i Allow task to be run on demand på fanebladet Settings :
Så kan vi bedre teste opsætningen. Klik på OK og indtast password for brugeren der skal eksekvere programmet. Højreklik på den nye task og vælg Run. Hvis ellers dit program er tilpas fejlbehæftet, vil du indenfor et par minutter modtage en mail med besked om dette. Derudover vil der være en angivelse af returkode, samt en vedhæftet logfil: Log: Man kan også læse mailen på sin telefon og åbne log-filen, mens man sidder i toget eller på cyklen og fundere over hvad der er galt med programmet.
Når du har modtaget mailen og rettet programmet til, så der ikke længere er nogle fejl, kan du prøve at køre scriptet igen. Derefter kan du vente et par timer for at se om der kommer en mail. God fornøjelse.
Appendiks (D:\Temp\Proc_DoesNotExist.sas) %put Dette burde ikke virke; Proc DoesNotExist; by notpresent; run; (D:\Temp\Proc_DoesNotExist.ps1) $smtpserver = "[Name of SMTP-Server]" $mailto = "[E-mail address]" $mailfrom = "[E-mail sender]" $saspgm = 'D:\Temp\Proc_DoesNotExist.sas' $logfolder = 'D:\Temp\' $sasexe = 'D:\Program Files\SASHome\SASFoundation\9.3\sas.exe' $sascfg = 'D:\Program Files\SASHome\SASFoundation\9.3\sasv9.cfg'; $param = '-logparm "rollover=session" -noautoexec -sasuser work -batch -nologo -nodms -icon -errorabend ' # Execute SAS program $ts = get-date -format 'yyyy-mm-dd_hh-mm-ss_fff' $base = [io.path]::getfilenamewithoutextension($saspgm).trim() $log = $logfolder.trim() + '\' + $base + '_' + $ts + '.log' $arg = '-config "' + $sascfg.trim() + '" -sysin "' + $saspgm.trim() + '" -log "' + $log + '" ' + $param $process = Start-Process $sasexe $arg -Wait -PassThru # Send an email if SAS program failed if ($process.exitcode -gt 0) { $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg = new-object Net.Mail.MailMessage $msg.from = $mailfrom $msg.to.add($mailto) $msg.subject = 'Return code ' + $process.exitcode + ' in ' + $saspgm.trim() if (Test-Path($log)) { $att = new-object Net.Mail.Attachment($log) $msg.attachments.add($att) $msg.body = 'Log file "' + $log + '" attached' $smtp.send($msg) $att.dispose() else { $msg.body = 'No SAS log file created'; $smtp.send($msg)