# encoding: ascii
# api: powershell
# title: Function Run-Script
# description: This function should be included in the PowerShell ISE profile.ps1 and it will display the start and end times of any scripts started clicking ‘Run Script’ (or ALT+R) in the Add-ons Menu; additionally they will be logged to the Scripts Event Log (which needs creating first) and also to a text log file. This defaults to that created by the Windows Script Monitor Service (available from www.SeaStarDevelopment.Bravehost.com) which normally indicates the full command line used to start each script.
# version: 2.0
# type: function
# author: Archdeacon
# license: CC0
# function: Run-Script
# x-poshcode-id: 3094
# x-derived-from-id: 3103
# x-archived: 2015-04-24T02:04:48
# x-published: 2012-12-13T20:33:00
#
#
#################################################################################
# This function should be included in the PowerShell ISE profile.ps1 and it will 
# display the start and end times of any scripts started by clicking 'Run Script'
# in the Add-ons Menu, or F2; additionally they will be logged to the Scripts
# Event Log (which needs creating first) and also to a text log file. This 
# defaults to that created by the Windows Script Monitor Service (available from 
# www.SeaStarDevelopment.Bravehost.com) which normally indicates the full command
# line used to start each script.
# V2.0 Use Try/Catch to trap (child) script errors & change Hotkey to F2.
#################################################################################

function Run-Script {
   $script = $psISE.CurrentFile.DisplayName
   if ($script.StartsWith("Untitled") -or $script.Contains("profile.") -or `
      ($host.Name -ne 'Windows PowerShell ISE Host' )) {
      return
   }
   $psISE.CurrentFile.Save()
   $logfile = "$env:programfiles\Sea Star Development\" + 
        "Script Monitor Service\ScriptMon.txt"                   #Change to suit.        
   if (!(Test-Path env:\JobCount)) {
      $env:JobCount = 1                #This will work across multi Tab sessions.
   }
   $number = $env:JobCount.PadLeft(4,'0')
   $startTime = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
   $tag  = "$startTime [$script] start. --> PSE $($myInvocation.Line)"
   if (Test-Path $logfile) {
       $tag | Out-File $logfile -encoding 'Default' -Append
   }
   "$startTime [$script] started." 
   Write-EventLog -Logname Scripts -Source Monitor -EntryType Information -EventID 2 -Category 002 -Message "Script Job: $script (PSE$number) started."
   try {
      Invoke-Command -Scriptblock { & $pwd\$script }
   }
   catch {
      Write-Host -ForegroundColor Red ">>> ERROR: $_"
   }
   $endTime = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
   $tag  = "$endTime [$script] ended. --> PSE $($myInvocation.Line)"
   if (Test-Path $logfile) {
      $tag | Out-File $logfile -encoding 'Default' -Append
   }
   "$endTime [$script] ended."
   Write-Eventlog -Logname Scripts -Source Monitor -EntryType Information -EventID 1 -Category 001 -Message "Script Job: $script (PSE$number) ended."
   $env:JobCount = [int]$env:JobCount+1
}

$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Add("Run Script",{Run-Script}, "F2") | Out-Null
