<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'PowerShell', 'automation', and 'start-job'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=PowerShell,automation,start-job&amp;orTags=0</link><description>Search results matching tags 'PowerShell', 'automation', and 'start-job'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>PowerShell, Start-Job, -ScriptBlock = sad panda face</title><link>http://sqlblog.com/blogs/aaron_bertrand/archive/2011/01/29/powershell-start-job-scriptblock-sad-panda-face.aspx</link><pubDate>Sat, 29 Jan 2011 22:04:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:33015</guid><dc:creator>AaronBertrand</dc:creator><description>
&lt;p&gt;I am working on a project where I am using PowerShell to collect a lot of performance counters from a lot of servers.&amp;nbsp; More on that later.&amp;nbsp; For now I wanted to highlight an important lesson I learned when trying to use Start-Job to call a PS script using -ScriptBlock and passing in parameters.&amp;nbsp; This could be a comedy of errors if you haven't come across it before, so I thought it might be useful to throw up a quick post about it.&lt;/p&gt;

&lt;p&gt;To keep things simple, let's say I am calling a script with two parameters, am exporting a CSV file, and want those parameters embedded in the name of the CSV file.&amp;nbsp; Something nice and easy, like this:&lt;br&gt;&lt;/p&gt;


&lt;blockquote&gt;
&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#00008b"&gt;param&lt;/font&gt; &lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;            
            
&lt;font color="#00008b"&gt;function&lt;/font&gt; &lt;font color="#8a2be2"&gt;JobTest&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt;            
    &lt;font color="#00008b"&gt;param&lt;/font&gt; &lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;            
            
    &lt;font color="#0000ff"&gt;Get-Counter&lt;/font&gt; &lt;font color="#a9a9a9"&gt;|&lt;/font&gt; &lt;font color="#0000ff"&gt;Export-Csv&lt;/font&gt; &lt;font color="#8b0000"&gt;"C:\csv\$foo-$bar.csv"&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;            
&lt;font color="#000000"&gt;}&lt;/font&gt;            
            
&lt;font color="#0000ff"&gt;JobTest&lt;/font&gt; &lt;font color="#000080"&gt;-foo&lt;/font&gt; &lt;font color="#ff4500"&gt;$foo&lt;/font&gt; &lt;font color="#000080"&gt;-bar&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/blockquote&gt;


&lt;p&gt;Calling this from the command line is straightforward, and works as expected:&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"test"&lt;/font&gt; &lt;font color="#8b0000"&gt;"1"&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: success!&amp;nbsp; The file "test-1.csv" is created and we are happy.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Now, let's make things a little more complicated. Let's say with one script I want to call multiple jobs that will call this script asynchronously for a set of values for $foo and $bar.&amp;nbsp; I might try creating a second script file like this:&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#00008b"&gt;param&lt;/font&gt; &lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;            
            
&lt;font color="#00008b"&gt;function&lt;/font&gt; &lt;font color="#8a2be2"&gt;StartJobs&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt;            
    &lt;font color="#00008b"&gt;param&lt;/font&gt; &lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#008080"&gt;[string]&lt;/font&gt;&lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;            
            
    &lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#ff4500"&gt;$foo&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt;            
&lt;font color="#000000"&gt;}&lt;/font&gt;            
            
&lt;font color="#0000ff"&gt;StartJobs&lt;/font&gt; &lt;font color="#000080"&gt;-foo&lt;/font&gt; &lt;font color="#ff4500"&gt;$foo&lt;/font&gt; &lt;font color="#000080"&gt;-bar&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;When I call this from the command line:&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;C:\csv\StartJobs.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"test"&lt;/font&gt; &lt;font color="#8b0000"&gt;"2"&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: not so good. A file is created, but it is named "-.csv" (so "test" and "2" got lost somehow).&lt;/p&gt;

&lt;p&gt;Next, I tried embedding the variables in quotes in the Start-Job call (in the remaining code samples, I am just showing the changes to line 6 of StartJobs.ps1):&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"$foo"&lt;/font&gt; &lt;font color="#8b0000"&gt;"$bar"&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: still not good. The "-.csv" file is over-written by a new version.&lt;/p&gt;

&lt;p&gt;After that, I tried using -ArgumentList to pass the values in:&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"$foo"&lt;/font&gt; &lt;font color="#8b0000"&gt;"$bar"&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt; &lt;font color="#000080"&gt;-ArgumentList&lt;/font&gt; &lt;font color="#ff4500"&gt;$foo&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: error message as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;&lt;div style="text-align:left;color:red;padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;Start-Job : Cannot bind parameter 'InitializationScript'. Cannot convert the "5" value of type "System.String" to type "System.Management.Automation.ScriptBlock".&lt;br&gt;At C:\csv\StartJobs.ps1:6 char:11&lt;br&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Start-Job &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp; -ScriptBlock { C:\csv\JobTest.ps1 "$foo" "$bar" } -ArgumentList $foo $bar&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + CategoryInfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : InvalidArgument: (:) [Start-Job], ParameterBindingException&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.StartJobCommand&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, of course... silly me, I forgot the comma between $foo and $bar.&amp;nbsp; Let's try this: &lt;br&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"$foo"&lt;/font&gt; &lt;font color="#8b0000"&gt;"$bar"&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt; &lt;font color="#000080"&gt;-ArgumentList&lt;/font&gt; &lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: no error this time, but we have created yet another file named "-.csv" so our arguments are still not getting passed in correctly.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;A bit of searching around and I see that -ArgumentList should be used with $args[i] as opposed to the explicitly-named argument.&amp;nbsp; Aha!&amp;nbsp; I am lulled into the belief that I have finally figured out the problem.&amp;nbsp; So I try this:&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"$args[0]"&lt;/font&gt; &lt;font color="#8b0000"&gt;"$args[1]"&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt; &lt;font color="#000080"&gt;-ArgumentList&lt;/font&gt; &lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;            
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: once again no error, but once again we have created another "-.csv" file. Bummer.&lt;/p&gt;

&lt;p&gt;I search exhaustively for alternate syntax examples - surely someone out there is passing parameters into a Start-Job call?&amp;nbsp; I find the @(arg, arg) syntax somewhere (all apologies, I don't recall where I spotted this).&amp;nbsp; So I try it this way:&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#8b0000"&gt;"$args[0]"&lt;/font&gt; &lt;font color="#8b0000"&gt;"$args[1]"&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt; &lt;font color="#000080"&gt;-ArgumentList&lt;/font&gt; &lt;font color="#000000"&gt;@(&lt;/font&gt;&lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: nada. Still a poorly-named "-.csv" file.&amp;nbsp; I try one more stab, and remove the quotes around the arguments within the -ScriptBlock: &lt;br&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;table bgcolor="#eeeeee" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre style="padding:10px 20px;font-size:12px;font-family:consolas,lucida console,courier new,courier;-moz-background-inline-policy:continuous;"&gt;&lt;font color="#0000ff"&gt;Start-Job&lt;/font&gt; &lt;font color="#000080"&gt;-ScriptBlock&lt;/font&gt; &lt;font color="#000000"&gt;{&lt;/font&gt; &lt;font color="#0000ff"&gt;C:\csv\JobTest.ps1&lt;/font&gt; &lt;font color="#ff4500"&gt;$args&lt;/font&gt;&lt;font color="#a9a9a9"&gt;[&lt;/font&gt;&lt;font color="#800080"&gt;0&lt;/font&gt;&lt;font color="#a9a9a9"&gt;]&lt;/font&gt; &lt;font color="#ff4500"&gt;$args&lt;/font&gt;&lt;font color="#a9a9a9"&gt;[&lt;/font&gt;&lt;font color="#800080"&gt;1&lt;/font&gt;&lt;font color="#a9a9a9"&gt;]&lt;/font&gt; &lt;font color="#000000"&gt;}&lt;/font&gt; &lt;font color="#000080"&gt;-ArgumentList&lt;/font&gt; &lt;font color="#000000"&gt;@(&lt;/font&gt;&lt;font color="#ff4500"&gt;$foo&lt;/font&gt;&lt;font color="#a9a9a9"&gt;,&lt;/font&gt; &lt;font color="#ff4500"&gt;$bar&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p&gt;Result: success! Finally, I have a file named "test-9.csv" - it only took 9 tries (and lots of cursing) to get the syntax right!&amp;nbsp; For the PowerShell veterans and gurus out there, you are probably saying, "DUH!"&amp;nbsp; But I am neither, and I spent a lot of time experimenting with this and trying to figure out what the problem was, so I hope this helps prevent the same frustration for someone else at some point.&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &lt;br&gt;&lt;/p&gt;</description></item></channel></rss>