{"id":172,"date":"2018-06-12T05:40:17","date_gmt":"2018-06-12T05:40:17","guid":{"rendered":"http:\/\/michaelschultz.net\/tech\/?p=172"},"modified":"2018-06-12T05:49:44","modified_gmt":"2018-06-12T05:49:44","slug":"vscode_script_template_with_logging","status":"publish","type":"post","link":"https:\/\/michaelschultz.net\/tech\/vscode_script_template_with_logging\/","title":{"rendered":"VSCode script template with logging"},"content":{"rendered":"<p>I recently created an alternative version of the script template. This one is for PowerShell scripts and includes additions for the logging that I do both within a log file and Event Viewer. I am including the template and the code to add to VSCode to make it a snippet. I also have the code and snippets for adding the logging within the script.<!--more--><\/p>\n<p>Template<\/p>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\"><span class=\"coMULTI\">&lt;#<br \/>\n.SYNOPSIS<br \/>\nScript synopsis<br \/>\n<br \/>\n.SYNTAX<br \/>\nScript syntax<br \/>\n<br \/>\n.DESCRIPTION<br \/>\nScript description<br \/>\n<br \/>\n.PARAMETER Parameter input descriptions and repeat this as needed for each parameter<br \/>\n<br \/>\n.INPUTS<br \/>\nInput description if used<br \/>\n<br \/>\n.OUTPUTS<br \/>\nOutput description if used<br \/>\n<br \/>\n.NOTES<br \/>\nFileName:<br \/>\nAuthor: Michael Schultz<br \/>\nContact:<br \/>\nCreated: 20180606<br \/>\nModified:<br \/>\nVersion:<br \/>\n<br \/>\n.EXAMPLE<br \/>\nExample description and example<br \/>\n<br \/>\n#&gt;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#-----Parameters-----<\/span><br \/>\n<br \/>\n<span class=\"kw3\">Param<\/span> <span class=\"br0\">&#40;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#-----Initializations and Module Imports-----<\/span><br \/>\n<br \/>\n<span class=\"co1\">#-----Variables-----<\/span><br \/>\n<br \/>\n<span class=\"co1\">#set Event Log Name, Event Log Source and Log file unique name<\/span><br \/>\n<span class=\"re0\">$evntlog<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">''<\/span><br \/>\n<span class=\"re0\">$source<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">''<\/span><br \/>\n<br \/>\n<span class=\"co1\"># set Log File path and Log File name<\/span><br \/>\n<span class=\"re0\">$logpath<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">''<\/span><br \/>\n<span class=\"re0\">$logfile<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$logpath<\/span> <span class=\"sy0\">+<\/span> <span class=\"re0\">$source<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">'.log'<\/span><br \/>\n<br \/>\n<span class=\"co1\">#-----Functions-----<\/span><br \/>\n<br \/>\n<span class=\"co1\">#-----Logging-----<\/span><br \/>\n<br \/>\n<span class=\"co1\">#set Event Log logging as the source needs to exist prior to writing to the log this will check for it and create if not there<\/span><br \/>\n<span class=\"kw3\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>System.Diagnostics.EventLog<span class=\"br0\">&#93;<\/span>::SourceExists<span class=\"br0\">&#40;<\/span><span class=\"re0\">$source<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw4\">-eq<\/span> <span class=\"re0\">$False<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nNew<span class=\"sy0\">-<\/span>EventLog <span class=\"kw5\">-LogName<\/span> <span class=\"re0\">$evntlog<\/span> <span class=\"sy0\">-<\/span>Source <span class=\"re0\">$source<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#Check for logfile, remove log file if bigger than 5MB to prevent bloat, and create new logfile<\/span><br \/>\n<span class=\"kw3\">If<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">Test-Path<\/span> <span class=\"re0\">$Logfile<\/span> <span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw3\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">Get-Item<\/span> <span class=\"re0\">$Logfile<\/span> <span class=\"br0\">&#41;<\/span>.Length <span class=\"kw4\">-gt<\/span> 5MB<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">remove-item<\/span> <span class=\"re0\">$Logfile<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw3\">else<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">new-item<\/span> <span class=\"kw5\">-Path<\/span> <span class=\"re0\">$Logfile<\/span> \u2013itemtype file<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co1\">#-----Execution-----<\/span><\/div><\/div>\n<p>Code for snippet in VSCode<\/p>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\"><span class=\"st0\">&quot;Template with Logging&quot;<\/span>: <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;prefix&quot;<\/span>: <span class=\"st0\">&quot;temp_log&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;body&quot;<\/span>: <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"st0\">&quot;&lt;#&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.SYNOPSIS&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Script synopsis&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.SYNTAX&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Script syntax&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.DESCRIPTION&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Script description&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.PARAMETER &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Parameter input descriptions and repeat this as needed for each parameter&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.INPUTS&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Input description if used&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.OUTPUTS&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Output description if used&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.NOTES&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;FileName: &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Author: Michael Schultz&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Contact: &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Created: $CURRENT_YEAR$CURRENT_MONTH$CURRENT_DATE&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Modified: &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Version: &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;.EXAMPLE&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Example description and example&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#&gt;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#-----Parameters-----&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Param (&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;)&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#-----Initializations and Module Imports-----&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#-----Variables-----&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#set Event Log Name, Event Log Source and Log file unique name&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;$$evntlog = ''&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;$$source = ''&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;# set Log File path and Log File name&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;$$logpath = ''&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;$$logfile = $$logpath + $$source + '.log'&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#-----Functions-----&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#-----Logging-----&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#set Event Log logging as the source needs to exist prior to writing to the log this will check for it and create if not there&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;if ([System.Diagnostics.EventLog]::SourceExists($$source) -eq $$False)&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;{&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; New-EventLog -LogName $$evntlog -Source $$source&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;}&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#Check for logfile, remove log file if bigger than 5MB to prevent bloat, and create new logfile&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;If (Test-Path $$Logfile )&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;{&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; if ((Get-Item $$Logfile ).Length -gt 5MB) &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; {&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; remove-item $$Logfile &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; }&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;}&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;else&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;{&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; new-item -Path $$Logfile \u2013itemtype file&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;}&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;#-----Execution-----&quot;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;description&quot;<\/span>: <span class=\"st0\">&quot;PowerShell Template with Logging&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>It is a good idea to decide on Event IDs if you are going to write custom Event Logs. These are the IDs I decided to use for Compliance Settings.<br \/>\n\u2022 17 &#8211; compliance check starting<br \/>\n\u2022 42 &#8211; success (hitchhiker&#8217;s guide)<br \/>\n\u2022 1984 &#8211; error (1984)<br \/>\n\u2022 1822 &#8211; needs remediation (Babbage)<br \/>\n\u2022 1138 &#8211; Remediation starting (THX-1138)<br \/>\n\u2022 1949 &#8211; Remediation finished with some errors and may still be non-compliant (John von Neumann&#8217;s article on the &#8220;Theory of self-reproducing automata&#8221; is published)<br \/>\n\u2022 1936 &#8211; successful remediation (Turing)<\/p>\n<p>Now that we have a template to use for a script that has logging features, how do we handle the actual logging? The Write-EventLog cmdlet is used to write to an Event Log. You need the name of the log, the source, entry type, Event ID, and the message. The template already includes variables used for the log name and source.<\/p>\n<p>Here is the code I use to write to an Event Log.<\/p>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\">Write<span class=\"sy0\">-<\/span>EventLog \u2013LogName <span class=\"re0\">$evntlog<\/span> \u2013Source <span class=\"re0\">$source<\/span> \u2013EntryType Information \u2013EventID \u2013Message <span class=\"st0\">''<\/span><\/div><\/div>\n<p>What if you want to capture and write an error message to the Event Log? This is where \u2013ErrorVariable comes into play. Using \u2013ErrorVariable, we write the error message to a variable and then use that variable with the Write-EventLog cmdlet.<\/p>\n<p>The code follows a cmdlet to write any error messages to a variable. It then checks if the variable is NULL. If it is, then an error message wasn\u2019t captured. If it is not NULL, it writes the variable to the Event Log, sets the variable back to NULL and also sets a new variable as true. This last variable isn\u2019t needed, but I use it at the end of my script so I know if it completed running the script and an error message was captured. This goes with my custom Event ID of 1949 which is remediation of a compliance setting configuration item finished with some errors and may not be compliant.<\/p>\n<p>Here is what that code looks like.<\/p>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\"><span class=\"kw5\">-ErrorVariable<\/span> ProcessError<br \/>\n<span class=\"kw3\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$ProcessError<\/span> <span class=\"kw4\">-ne<\/span> <span class=\"re0\">$null<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nWrite<span class=\"sy0\">-<\/span>EventLog \u2013LogName <span class=\"re0\">$evntlog<\/span> \u2013Source <span class=\"re0\">$source<\/span> \u2013EntryType Error \u2013EventID \u2013Message <span class=\"st0\">'$ProcessError'<\/span><br \/>\n<span class=\"re0\">$ProcessError<\/span> <span class=\"sy0\">=<\/span> null<br \/>\n<span class=\"re0\">$err<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'true'<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>We can do pretty much the same thing in write to a log file and not to an event log. This is done with the Add-content cmdlet and what I use looks like this.<\/p>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\"><span class=\"re0\">$mydate<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">Get-Date<\/span><br \/>\n<span class=\"kw1\">Add-content<\/span> <span class=\"re0\">$Logfile<\/span> <span class=\"kw5\">-value<\/span> <span class=\"st0\">'$mydate; '<\/span><\/div><\/div>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\"><span class=\"kw5\">-ErrorVariable<\/span> ProcessError<br \/>\n<span class=\"kw3\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$ProcessError<\/span> <span class=\"kw4\">-ne<\/span> <span class=\"re0\">$null<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"re0\">$mydate<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">Get-Date<\/span><br \/>\n<span class=\"kw1\">Add-content<\/span> <span class=\"re0\">$Logfile<\/span> <span class=\"kw5\">-value<\/span> <span class=\"st0\">'$mydate; $ProcessError'<\/span><br \/>\n<span class=\"re0\">$ProcessError<\/span> <span class=\"sy0\">=<\/span> null<br \/>\n<span class=\"re0\">$err<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'true'<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Below is the code to add to VSCode to use for your code snippets.<\/p>\n<div class=\"codecolorer-container powershell default\" style=\"overflow:auto;white-space:nowrap;width:500px;\"><div class=\"powershell codecolorer\"><span class=\"st0\">&quot;EventLog &quot;<\/span>: <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;scope&quot;<\/span>: <span class=\"st0\">&quot;powershell&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;prefix&quot;<\/span>: <span class=\"st0\">&quot;event&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;body&quot;<\/span>: <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"st0\">&quot;Write-EventLog \u2013LogName $$evntlog \u2013Source $$source \u2013EntryType Information \u2013EventID \u2013Message ''&quot;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;description&quot;<\/span>: <span class=\"st0\">&quot;Write to Event Log&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<br \/>\n<span class=\"st0\">&quot;EventLog_ErrorCatch&quot;<\/span>: <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;scope&quot;<\/span>: <span class=\"st0\">&quot;powershell&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;prefix&quot;<\/span>: <span class=\"st0\">&quot;event&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;body&quot;<\/span>: <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"st0\">&quot; -ErrorVariable ProcessError&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;if ($$ProcessError -ne $$null)&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;{&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; Write-EventLog \u2013LogName $$evntlog \u2013Source $$source \u2013EntryType Error \u2013EventID \u2013Message '$$ProcessError'&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; $$ProcessError = $null&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; $$err = 'true'&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;}&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;description&quot;<\/span>: <span class=\"st0\">&quot;Error Process and write error to Event Log&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<br \/>\n<span class=\"st0\">&quot;LogFile&quot;<\/span>: <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;scope&quot;<\/span>: <span class=\"st0\">&quot;powershell&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;prefix&quot;<\/span>: <span class=\"st0\">&quot;log&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;body&quot;<\/span>: <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"st0\">&quot;$$mydate = Get-Date&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;Add-content $$Logfile -value '$$mydate; '&quot;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;description&quot;<\/span>: <span class=\"st0\">&quot;Write to log file&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<br \/>\n<span class=\"st0\">&quot;LogFile_ErrorCatch&quot;<\/span>: <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;scope&quot;<\/span>: <span class=\"st0\">&quot;powershell&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;prefix&quot;<\/span>: <span class=\"st0\">&quot;log&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;body&quot;<\/span>: <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"st0\">&quot; -ErrorVariable ProcessError&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;if ($$ProcessError -ne $$null)&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;{&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; $$mydate = Get-Date&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; Add-content $$Logfile -value '$$mydate; $$ProcessError'&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; $$ProcessError = $null&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot; $$err = 'true'&quot;<\/span><br \/>\n<span class=\"st0\">&quot;}&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;description&quot;<\/span>: <span class=\"st0\">&quot;Error Process and write error to log file&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>Additional reading and information:<br \/>\nUsing VSCode snippets to apply your script template &#8211; <a href=\"http:\/\/michaelschultz.net\/tech\/using-vscode-snippets-to-apply-your-script-template\/\" target=\"_blank\" rel=\"noopener\">http:\/\/michaelschultz.net\/tech\/using-vscode-snippets-to-apply-your-script-template\/<\/a><br \/>\nWrite-EventLog &#8211; <a href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.management\/write-eventlog?view=powershell-5.1\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.management\/write-eventlog?view=powershell-5.1 <\/a><br \/>\nError handling in PowerShell &#8211; <a href=\"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2014\/07\/09\/handling-errors-the-powershell-way\/\" target=\"_blank\" rel=\"noopener\">https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2014\/07\/09\/handling-errors-the-powershell-way\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently created an alternative version of the script template. This one is for PowerShell scripts and includes additions for the logging that I do both within a log file and Event Viewer. I am including the template and the code to add to VSCode to make it a snippet. I also have the code &hellip; <a href=\"https:\/\/michaelschultz.net\/tech\/vscode_script_template_with_logging\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;VSCode script template with logging&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[14,13,22],"tags":[11,23],"class_list":["post-172","post","type-post","status-publish","format-standard","hentry","category-powershell","category-scripting","category-vscode","tag-powershell","tag-vscode"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p98a2r-2M","post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/posts\/172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/comments?post=172"}],"version-history":[{"count":5,"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/posts\/172\/revisions"}],"predecessor-version":[{"id":177,"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/posts\/172\/revisions\/177"}],"wp:attachment":[{"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/media?parent=172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/categories?post=172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaelschultz.net\/tech\/wp-json\/wp\/v2\/tags?post=172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}