Getting commands and parameters in Powershell and Psake can be pretty troublesome at times. The echoargs helper from the PowerShell Community Extensions can be a lifesaver. If, for instance, you are calling
msbuild.exe /t:Build /p:SomeTroublesomeParametersHere
if you swap msbuild for echoargs (after placing the extensions in C:\Windows\System32\WindowsPowerShell\v1.0\Modules and calling Import-Module pscx), then you’ll see the exact parameters being passed to the executable:
Arg 0 is </t:Build> Arg 1 is </p:SomeTroublesomeParametersHere>
However, to make it easier for those dipping into our build scripts, I decided to create a wrapper function so that we would always output parameters to the external functions we call to the console for debugging purposes.
function Invoke-EchoCommand { $cmdName = $args[0]; $remainingArgs = $args[1..$args.Length] Write-Host "Executing $cmdName" -ForegroundColor darkgray & "$base_dir/tools/build/echoargs" @remainingArgs | Write-Host -ForegroundColor darkgray exec { & $cmdName @remainingArgs } # using exec helper in PSake }
You can then replace any calls to exec with
Invoke-EchoCommand msbuild.exe /t:Build /p:SomeTroublesomeParametersHere
and you’ll get some helpful debug information over how the parameters were actually passed. The only nifty bit in the function is that it uses the first parameter as the command name, and then passes all remaining arguments on to the executed command.