Parameters with double quotes are not properly passed to Scriptblock by ArgumentList

Midi picture Midi · Feb 20, 2013 · Viewed 23.1k times · Source

I'm writing generic powershell script to perform deployments on remote machines. I have hit one problem I can not overrun, and this problem is with parameters with double quotes in Scriptblock passed by ArgumentList

I have something like this:

$remoteAddress = "some-pc"
$deploymentCommand = "D:\some path\Command.exe"
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`")

foreach ($deploymentPackage in $deploymentPackages)
{
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) &  $deployCmd -package:$deployPackage -action:doit } -ArgumentList   $deploymentCommand,$deploymentPackage
}

I have added double quotes in $deploymentPackages. And still I'm getting my command executed remotly like this (which of course fails):

D:\some path\Command.exe -package:package - one - external -action:doit
D:\some path\Command.exe -package:package - two - external -action:doit
D:\some path\Command.exe -package:package - three - external -action:doit

while proper execution path should be:

D:\some path\Command.exe -package:"package - three - external" -action:doit

without quotes around package - one - external which mess up everythig

How to overrun this problem, because i have tested number of solutions and non of them worked.

Thanks for help in advance!

Answer

Frode F. picture Frode F. · Feb 20, 2013

You can fix this by using single quotes to wrap your strings. With single quotes, the content between the quotes will be untouched(variables won't expand and signs like quotes will be kept). E.g.

PS > '"this is a test"'
"this is a test"

So to fix your script, try replacing your deploymentpackages array with this:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"')