{"id":178,"date":"2013-03-16T12:44:33","date_gmt":"2013-03-16T19:44:33","guid":{"rendered":"http:\/\/www.jsnover.com\/blog\/?p=178"},"modified":"2013-09-22T17:59:18","modified_gmt":"2013-09-23T00:59:18","slug":"evolution-of-a-script-timing-operations","status":"publish","type":"post","link":"https:\/\/www.jsnover.com\/blog\/2013\/03\/16\/evolution-of-a-script-timing-operations\/","title":{"rendered":"Evolution of a Script:  Timing Operations"},"content":{"rendered":"<p>I just love PowerShell!\u00a0 One of the things I love the most about it is that you can pick the level of programming you want, write a script and then evolve it to meet whatever need you have.\u00a0 Sometimes you want something quick and dirty and other times you want something you&#8217;ll share with others and then other times you want something that is going to be used in production.<!--more--><\/p>\n<p>When I was earning my living on Unix systems, I used to write quick and dirty CSH scripts (yeah\u00a0&#8211; I was one of those guys) but then when I wanted something more formal or to share with others, often I would throw away the script and restart from scratch.\u00a0 I don&#8217;t do that with PowerShell.<\/p>\n<p>This morning\u00a0I was reviewing someone&#8217;s scripts that they were going to use to perform a large scale upgrade to a datacenter.\u00a0 The code had lots of validation and verbose output and then they had lots of code that looked like this:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span class=\"comment\">#Start\u00a0Stopwatch<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"variable\">$sw<\/span><span>\u00a0=\u00a0[Diagnostics.Stopwatch]::StartNew()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#&#8230;..<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"variable\">$sw<\/span><span>.Stop()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"builtin\">Write-Verbose<\/span><span>\u00a0<\/span><span class=\"string\">&#8220;Total\u00a0ElapsedTime:\u00a0$($sw.Elapsed.TotalSeconds)\u00a0Seconds&#8221;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<\/ol>\n<\/div>\n<p>I thought that I would help out by providing a helper function so I wrote my first version of the script like this:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span>Function\u00a0Measure-Time\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span><span class=\"keyword\">param<\/span><span>(\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#ScriptBlock\u00a0that\u00a0you\u00a0want\u00a0to\u00a0measure\u00a0the\u00a0timing\u00a0of<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>[Parameter(Position=0,\u00a0Mandatory=1)]\u00a0\u00a0<\/span><\/li>\n<li><span>[ScriptBlock]<span class=\"variable\">$ScriptBlock<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>)\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$StopWatch<\/span><span>\u00a0=\u00a0[Diagnostics.Stopwatch]::StartNew()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0&amp;<span class=\"variable\">$ScriptBlock<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$StopWatch<\/span><span>.Stop()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0<span class=\"builtin\">Write-Verbose<\/span><span>\u00a0<\/span><span class=\"string\">&#8220;Total\u00a0ElapsedTime:\u00a0$($StopWatch.Elapsed.TotalSeconds)\u00a0Seconds&#8221;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>}\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"builtin\">Set-Alias<\/span><span>\u00a0Time\u00a0Measure-Time\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"comment\">#Example\u00a0usage:<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>Time\u00a0{gps\u00a0*ss}\u00a0-Verbose\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<\/div>\n<p>So that worked great but then I thought about some problems:<\/p>\n<ul>\n<li>Using the variables $Stopwatch and $ScriptBlock, it meant that those variables couldn&#8217;t be used in the scriptblock that was passed in.\u00a0 Whenever you have a situation like this, the convention is to put 2 &#8220;_&#8221; in front of a name so I renamed them $__ScriptBlock and $__StopWatch.<\/li>\n<li>I didn&#8217;t have any help.\u00a0 I can never remember the keywords to add comment-based help so what I do is to start a new script, type CTRL-J to bring up snippets, select the CMDLET snippet and then cut\/paste the help from it and use it to fill it in.<\/li>\n<li>I wanted the user to be able to specify their own message so I provided a -__FormatString variable.<\/li>\n<li>If you are upgrading a datacenter, you want to use the belt and suspenders approach so I thought this information should be logged to the eventlog (this started the next leg of the journey but more about that later).<\/li>\n<\/ul>\n<p><!-- Stylesheet link -->The resultant script\u00a0was starting to look like something worth sharing:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span>&lt;<\/span><span class=\"comment\">#<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>.Synopsis\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0Measure\u00a0how\u00a0long\u00a0something\u00a0takes\u00a0\u00a0<\/span><\/li>\n<li><span>.DESCRIPTION\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0This\u00a0script\u00a0measures\u00a0how\u00a0long\u00a0it\u00a0takes\u00a0to\u00a0run\u00a0a\u00a0sequence\u00a0of\u00a0code\u00a0(a\u00a0ScriptBlock).\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0The\u00a0message\u00a0is\u00a0sent\u00a0to\u00a0the\u00a0Verbose\u00a0channel\u00a0so\u00a0to\u00a0see\u00a0it,\u00a0you\u00a0either\u00a0need\u00a0to\u00a0have\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0<span class=\"variable\">$VerbosePreference<\/span><span>\u00a0set\u00a0to\u00a0<\/span><span class=\"string\">&#8220;Continue&#8221;<\/span><span>\u00a0or\u00a0specify\u00a0-Verbose.\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>.EXAMPLE\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0Measure-Time\u00a0{\u00a0get-process\u00a0}\u00a0-Verbose\u00a0\u00a0<\/span><\/li>\n<li><span>.EXAMPLE\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0time\u00a0{get-process}\u00a0DataCenterUpgrade\u00a0<span class=\"string\">&#8220;It\u00a0took\u00a0{0:N3}\u00a0seconds\u00a0to\u00a0run\u00a0this&#8221;<\/span><span>\u00a0-verbose\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#&gt;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>Function\u00a0Measure-Time\u00a0\u00a0<\/span><\/li>\n<li><span>{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span><span class=\"keyword\">param<\/span><span>(\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#ScriptBlock\u00a0that\u00a0you\u00a0want\u00a0to\u00a0measure\u00a0the\u00a0timing\u00a0of<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>[Parameter(Position=0,\u00a0Mandatory=1)]\u00a0\u00a0<\/span><\/li>\n<li><span>[ScriptBlock]<span class=\"variable\">$__ScriptBlock<\/span><span>,\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"comment\">#\u00a0Name\u00a0of\u00a0the\u00a0LogSource\u00a0in\u00a0the\u00a0APPLICATION\u00a0EventLog\u00a0<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#\u00a0that\u00a0these\u00a0events\u00a0will\u00a0show\u00a0up\u00a0in.<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#\u00a0<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#\u00a0If\u00a0you\u00a0don&#8217;t\u00a0provide\u00a0a\u00a0value\u00a0&#8211;\u00a0no\u00a0log\u00a0entry\u00a0will\u00a0be\u00a0made.<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>[Parameter(Position=1)]\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>[String]<span class=\"variable\">$__LogSource<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$null<\/span><span>,\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#\u00a0An\u00a0alternate\u00a0format\u00a0string\u00a0for\u00a0the\u00a0Message<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>[Parameter(Position=2)]\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>[String]<span class=\"variable\">$__FormatString<\/span><span>=<\/span><span class=\"string\">&#8220;Total\u00a0ElapsedTime:\u00a0{0:N1}\u00a0Seconds&#8221;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>)\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$_StopWatch<\/span><span>\u00a0=\u00a0[Diagnostics.Stopwatch]::StartNew()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0&amp;<span class=\"variable\">$__ScriptBlock<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$_StopWatch<\/span><span>.Stop()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Message<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$__FormatString<\/span><span>\u00a0-f\u00a0<\/span><span class=\"variable\">$_StopWatch<\/span><span>.Elapsed.TotalSeconds\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0<span class=\"builtin\">Write-Verbose<\/span><span>\u00a0<\/span><span class=\"variable\">$Message<\/span><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$__LogSource<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Write-EventLog\u00a0-LogName\u00a0Application\u00a0`\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Source\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-EntryType\u00a0Information\u00a0`\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-EventId\u00a01\u00a0-Message\u00a0<span class=\"variable\">$Message<\/span><span>\u00a0\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>}\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"builtin\">Set-Alias<\/span><span>\u00a0-Name\u00a0Time\u00a0-Value\u00a0Measure-Time\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"comment\">#Example\u00a0usage:<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>Time\u00a0{gps\u00a0*ss}\u00a0DataCenterUpgrade\u00a0-Verbose\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<\/div>\n<p>So everything looked great until I went to run it and then it barfed complaining that there was no DataSource called &#8220;DataCenterUpgrade&#8221;.\u00a0 I&#8217;ve <strong>always<\/strong> believed that the different between a quick and dirty script and a production script was the error handling.\u00a0 When you are in a datacenter at 3am when you expected to be home at 7pm the previous evening and everything it turning to crap &#8211; you want to have GREAT error messages.<\/p>\n<p>I started off by adding some code to check for the DataSource and create it if it didn&#8217;t exist:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$__LogSource<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(![System.Diagnostics.EventLog]::SourceExists(<\/span><span class=\"variable\">$__LogSource<\/span><span>))\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0[System.Diagnostics.EventLog]::CreateEventSource(<span class=\"variable\">$__LogSource<\/span><span>,\u00a0<\/span><span class=\"string\">&#8220;Application&#8221;<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>}\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<\/div>\n<p>The problem with that is that it only works if you are running with Admin privs (which I wasn&#8217;t of course).\u00a0 So I put in a TRY\/Catch and spent some time crafting an excellent error message:<br \/>\n<!-- Stylesheet link --><\/p>\n<link href=\"http:\/\/www.thecomplex.plus.com\/styles\/SyntaxHighlighter.css\" rel=\"stylesheet\" type=\"text\/css\" \/>\n<p><!-- Code --><\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$__LogSource<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0try\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(![System.Diagnostics.EventLog]::SourceExists(<\/span><span class=\"variable\">$__LogSource<\/span><span>))\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[System.Diagnostics.EventLog]::CreateEventSource(<span class=\"variable\">$__LogSource<\/span><span>,\u00a0<\/span><span class=\"string\">&#8220;Application&#8221;<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0Write-EventLog\u00a0-LogName\u00a0Application\u00a0-Source\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-EntryType\u00a0Information\u00a0-EventId\u00a01\u00a0-Message\u00a0<span class=\"variable\">$Message<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0catch\u00a0[Exception]\u00a0<span class=\"comment\">#\u00a0An\u00a0exception\u00a0means\u00a0you\u00a0don&#8217;t\u00a0have\u00a0the\u00a0privs\u00a0to\u00a0create\u00a0the\u00a0source<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"builtin\">Write-Error<\/span><span>\u00a0-Message\u00a0<\/span><span class=\"string\">&#8220;Cannot\u00a0Write\u00a0to\u00a0or\u00a0Create\u00a0EventLogSource\u00a0($__LogSource)&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Exception\u00a0<span class=\"variable\">$_<\/span><span>.Exception\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Category\u00a0ResourceUnavailable\u00a0`\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-TargetObject\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-RecommendedAction\u00a0<span class=\"string\">&#8220;Create\u00a0LogSource\u00a0($__LogSource)\u00a0using\u00a0an\u00a0account\u00a0with\u00a0Admin\u00a0privs&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-ErrorId\u00a0<span class=\"string\">&#8220;CantWriteLog,Measure-Time&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-CategoryReason\u00a0CantFindorCreateLogSource\u00a0\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>}\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<\/div>\n<p>This produced a great error message so I was feeling pretty good about my script.\u00a0 Next I decided to look at the EventLog and realized that it was now logging perfectly accurate and perfectly useless information.\u00a0 It was saying how long it took to do something but not how long it took to do WHAT?\u00a0 Now I could have handled this using the FormatString:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span>Time\u00a0{gps\u00a0*ss}\u00a0DataCenterUpgrade\u00a0<\/span><span class=\"string\">&#8220;It\u00a0took\u00a0{0:N}\u00a0to\u00a0Gps&#8221;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>Time\u00a0{Step2\u00a0\u00a0}\u00a0DataCenterUpgrade\u00a0<span class=\"string\">&#8220;It\u00a0took\u00a0{0:N}\u00a0to\u00a0do\u00a0STEP2&#8221;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<\/ol>\n<\/div>\n<p>But that looks\u00a0like a horrible user experience\u00a0so I decided to\u00a0include the scriptblock in the eventlog.\u00a0 It then hit me that I had no idea how long the scriptblock would be but\u00a0that it I was sure that the eventlog had a limit on the maximum size of the entry.\u00a0\u00a0I could have researched this but I decided to experiment instead.\u00a0 I created a\u00a0DataSource and then did a number of experiments like this:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span class=\"variable\">$x<\/span><span>\u00a0=\u00a0<\/span><span class=\"string\">&#8220;T&#8221;<\/span><span>\u00a0*\u00a01kb\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>Write-EventLog\u00a0-LogName\u00a0Application\u00a0-Source\u00a0MySource\u00a0<span class=\"variable\">$x<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"variable\">$x<\/span><span>\u00a0=\u00a0<\/span><span class=\"string\">&#8220;T&#8221;<\/span><span>\u00a0*\u00a010kb\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>Write-EventLog\u00a0-LogName\u00a0Application\u00a0-Source\u00a0MySource\u00a0<span class=\"variable\">$x<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"variable\">$x<\/span><span>\u00a0=\u00a0<\/span><span class=\"string\">&#8220;T&#8221;<\/span><span>\u00a0*\u00a0100kb\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>Write-EventLog\u00a0-LogName\u00a0Application\u00a0-Source\u00a0MySource\u00a0<span class=\"variable\">$x<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<\/ol>\n<\/div>\n<p>From this I determined that the max size was 32KB.\u00a0 I added code to only log the first 31KB of a scripblock.\u00a0 Now any reasonable person would point\u00a0 out that a 32KB scriptblock is enormous and we&#8217;ll never see this condition.<\/p>\n<p>Here is the point &#8211; that MAY be true.\u00a0 But if it isn&#8217;t true and it breaks at 3am while some poor soul is trying to stich his datacenter together, then I&#8217;ve just made his life even worse.\u00a0 And so we always code for that poor soul because one day, we will be that guy.\u00a0 (Remind me to tell you the story about having to sleep on the datacenter floor in a hospital in Memphis between bouts of hand stitching a database together while patients were delayed getting admitted for care.) So here is how that segment\u00a0came out:<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$__LogSource<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0try\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(![System.Diagnostics.EventLog]::SourceExists(<\/span><span class=\"variable\">$__LogSource<\/span><span>))\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[System.Diagnostics.EventLog]::CreateEventSource(<span class=\"variable\">$__LogSource<\/span><span>,\u00a0<\/span><span class=\"string\">&#8220;Application&#8221;<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">#\u00a0Maximum\u00a0size\u00a0of\u00a0a\u00a0Eventlog\u00a0Message\u00a0is\u00a032KB.\u00a0We\u00a0limit\u00a0to\u00a031KB.<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Script<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$__ScriptBlock<\/span><span>.ToString()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$Script<\/span><span>.Length\u00a0-ge\u00a031kb)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Script<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$Script<\/span><span>.Substring(0,\u00a031kb)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0Write-EventLog\u00a0-LogName\u00a0Application\u00a0-Source\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-EntryType\u00a0Information\u00a0-EventId\u00a01\u00a0-Message\u00a0$(\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Message<\/span><span>\u00a0+\u00a0<\/span><span class=\"string\">&#8221;\u00a0to\u00a0run\u00a0`n&#8221;<\/span><span>\u00a0+\u00a0<\/span><span class=\"variable\">$Script<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0catch\u00a0[Exception]\u00a0<span class=\"comment\">#\u00a0An\u00a0exception\u00a0means\u00a0you\u00a0don&#8217;t\u00a0have\u00a0the\u00a0privs\u00a0to\u00a0create\u00a0the\u00a0source<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"builtin\">Write-Error<\/span><span>\u00a0-Message\u00a0<\/span><span class=\"string\">&#8220;Cannot\u00a0Write\u00a0to\u00a0or\u00a0Create\u00a0EventLogSource\u00a0($__LogSource)&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Exception\u00a0<span class=\"variable\">$_<\/span><span>.Exception\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Category\u00a0ResourceUnavailable\u00a0`\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-TargetObject\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-RecommendedAction\u00a0<span class=\"string\">&#8220;Create\u00a0LogSource\u00a0($__LogSource)\u00a0using\u00a0an\u00a0account\u00a0with\u00a0Admin\u00a0privs&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-ErrorId\u00a0<span class=\"string\">&#8220;CantWriteLog,Measure-Time&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-CategoryReason\u00a0CantFindorCreateLogSource\u00a0\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>}\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<\/div>\n<p>&nbsp;<\/p>\n<p>So the point of this blog is that with PowerShell, you can start off with a quick and dirty and evolve it to meet whatever the requirements you have without having to start over from scratch.\u00a0 It is one of my favorite attributes of PowerShell.\u00a0 It should be &#8211; we designed it to do this.\u00a0 \ud83d\ude42\u00a0 So\u00a0below is\u00a0the script in the state I left it today.\u00a0 There is more that can be done but it is fit for the purpose it is going to be used for.\u00a0 We don&#8217;t have to make every script be model of perfection.<\/p>\n<div class=\"dp-highlighter\" id=\"hlDiv\">\n<div class=\"bar\"><\/div>\n<ol class=\"dp-rb\">\n<li class=\"alt\"><span><span>&lt;<\/span><span class=\"comment\">#<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>.Synopsis\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0Measure\u00a0how\u00a0long\u00a0something\u00a0takes\u00a0\u00a0<\/span><\/li>\n<li><span>.DESCRIPTION\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0This\u00a0script\u00a0measures\u00a0how\u00a0long\u00a0it\u00a0takes\u00a0to\u00a0run\u00a0a\u00a0sequence\u00a0of\u00a0code\u00a0(a\u00a0ScriptBlock).\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0The\u00a0message\u00a0is\u00a0sent\u00a0to\u00a0the\u00a0Verbose\u00a0channel\u00a0so\u00a0to\u00a0see\u00a0it,\u00a0you\u00a0either\u00a0need\u00a0to\u00a0have\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0<span class=\"variable\">$VerbosePreference<\/span><span>\u00a0set\u00a0to\u00a0<\/span><span class=\"string\">&#8220;Continue&#8221;<\/span><span>\u00a0or\u00a0specify\u00a0-Verbose.\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>.EXAMPLE\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0Measure-Time\u00a0{\u00a0get-process\u00a0}\u00a0-Verbose\u00a0\u00a0<\/span><\/li>\n<li><span>.EXAMPLE\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0time\u00a0{get-process}\u00a0DataCenterUpgrade\u00a0<span class=\"string\">&#8220;It\u00a0took\u00a0{0:N3}\u00a0seconds\u00a0to\u00a0run\u00a0this&#8221;<\/span><span>\u00a0-verbose\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#&gt;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>Function\u00a0Measure-Time\u00a0\u00a0<\/span><\/li>\n<li><span>{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span><span class=\"keyword\">param<\/span><span>(\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#ScriptBlock\u00a0that\u00a0you\u00a0want\u00a0to\u00a0measure\u00a0the\u00a0timing\u00a0of<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>[Parameter(Position=0,\u00a0Mandatory=1)]\u00a0\u00a0<\/span><\/li>\n<li><span>[ScriptBlock]<span class=\"variable\">$__ScriptBlock<\/span><span>,\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"comment\">#\u00a0Name\u00a0of\u00a0the\u00a0LogSource\u00a0in\u00a0the\u00a0APPLICATION\u00a0EventLog\u00a0<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#\u00a0that\u00a0these\u00a0events\u00a0will\u00a0show\u00a0up\u00a0in.<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span><span class=\"comment\">#\u00a0<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#\u00a0If\u00a0you\u00a0don&#8217;t\u00a0provide\u00a0a\u00a0value\u00a0&#8211;\u00a0no\u00a0log\u00a0entry\u00a0will\u00a0be\u00a0made.<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>[Parameter(Position=1)]\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>[String]<span class=\"variable\">$__LogSource<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$null<\/span><span>,\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span><span class=\"comment\">#\u00a0An\u00a0alternate\u00a0format\u00a0string\u00a0for\u00a0the\u00a0Message<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>[Parameter(Position=2)]\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>[String]<span class=\"variable\">$__FormatString<\/span><span>=<\/span><span class=\"string\">&#8220;Total\u00a0ElapsedTime:\u00a0{0:N1}\u00a0Seconds&#8221;<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>)\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$_StopWatch<\/span><span>\u00a0=\u00a0[Diagnostics.Stopwatch]::StartNew()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0&amp;<span class=\"variable\">$__ScriptBlock<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$_StopWatch<\/span><span>.Stop()\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Message<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$__FormatString<\/span><span>\u00a0-f\u00a0<\/span><span class=\"variable\">$_StopWatch<\/span><span>.Elapsed.TotalSeconds\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0<span class=\"builtin\">Write-Verbose<\/span><span>\u00a0<\/span><span class=\"variable\">$Message<\/span><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$__LogSource<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try\u00a0{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(![System.Diagnostics.EventLog]::SourceExists(<\/span><span class=\"variable\">$__LogSource<\/span><span>))\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[System.Diagnostics.EventLog]::CreateEventSource(<span class=\"variable\">$__LogSource<\/span><span>,\u00a0<\/span><span class=\"string\">&#8220;Application&#8221;<\/span><span>)\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">#\u00a0Maximum\u00a0size\u00a0of\u00a0a\u00a0Eventlog\u00a0Message\u00a0is\u00a032KB.\u00a0\u00a0We\u00a0limit\u00a0to\u00a031KB.<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Script<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$__ScriptBlock<\/span><span>.ToString()\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span><span>\u00a0(<\/span><span class=\"variable\">$Script<\/span><span>.Length\u00a0-ge\u00a031kb)\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Script<\/span><span>\u00a0=\u00a0<\/span><span class=\"variable\">$Script<\/span><span>.Substring(0,\u00a031kb)\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Write-EventLog\u00a0-LogName\u00a0Application\u00a0-Source\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0-EntryType\u00a0Information\u00a0-EventId\u00a01\u00a0-Message\u00a0$(\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"variable\">$Message<\/span><span>\u00a0+\u00a0<\/span><span class=\"string\">&#8221;\u00a0to\u00a0run\u00a0`n&#8221;<\/span><span>\u00a0+\u00a0<\/span><span class=\"variable\">$Script<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0catch\u00a0[Exception]\u00a0<span class=\"comment\">#\u00a0An\u00a0exception\u00a0means\u00a0you\u00a0don&#8217;t\u00a0have\u00a0the\u00a0privs\u00a0to\u00a0create\u00a0the\u00a0source<\/span><span>\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"builtin\">Write-Error<\/span><span>\u00a0-Message\u00a0<\/span><span class=\"string\">&#8220;Cannot\u00a0Write\u00a0to\u00a0or\u00a0Create\u00a0EventLogSource\u00a0($__LogSource)&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Exception\u00a0<span class=\"variable\">$_<\/span><span>.Exception\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-Category\u00a0ResourceUnavailable\u00a0`\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-TargetObject\u00a0<span class=\"variable\">$__LogSource<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-RecommendedAction\u00a0<span class=\"string\">&#8220;Create\u00a0LogSource\u00a0($__LogSource)\u00a0using\u00a0an\u00a0account\u00a0with\u00a0Admin\u00a0privs&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-ErrorId\u00a0<span class=\"string\">&#8220;CantWriteLog,Measure-Time&#8221;<\/span><span>\u00a0`\u00a0\u00a0<\/span><\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-CategoryReason\u00a0CantFindorCreateLogSource\u00a0\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li><span>\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0<\/span><\/li>\n<li class=\"alt\"><span>}\u00a0\u00a0<\/span><\/li>\n<li><span><span class=\"builtin\">Set-Alias<\/span><span>\u00a0-Name\u00a0Time\u00a0-Value\u00a0Measure-Time\u00a0\u00a0<\/span><\/span><\/li>\n<\/ol>\n<\/div>\n<p>I hope sharing my thought process was useful for your scripting.<\/p>\n<p>Cheers!<br \/>\nJeffrey<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I just love PowerShell!\u00a0 One of the things I love the most about it is that you can pick the level of programming you want, write a script and then evolve it to meet whatever need you have.\u00a0 Sometimes you &hellip; <a href=\"https:\/\/www.jsnover.com\/blog\/2013\/03\/16\/evolution-of-a-script-timing-operations\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-178","post","type-post","status-publish","format-standard","hentry","category-powershell"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts\/178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/comments?post=178"}],"version-history":[{"count":10,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts\/178\/revisions"}],"predecessor-version":[{"id":202,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts\/178\/revisions\/202"}],"wp:attachment":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/media?parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/categories?post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/tags?post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}