Psake, Powershell & Wix
I have the below function as a part of my psake build. When the build is executing Candle.exe throws this error:
candle.exe : warning CNDL1098: 'ext .\Build\Packages\WixWeb\bin\WixIIsExtension.dll' is not a valid command line argument.
I think this is a problem with the way I am passing command line args but I cannot for the life of me figure it out.
Any powershell monkeys have suggestions?
function buildMsi($build_dir, $template, $directory) {
"Building Msi"
"Build Folder: $build_dir"
"Wix Template: $template"
"Website: $directory"
$wixXml = [xml](Get-Content $template)
$namespaceManager = New-Object Xml.XmlNamespaceManager($wixXml.PSBase.NameTable)
$namespaceManager.AddNamespace("wi", "http://schemas.microsoft.com/wix/2006/wi")
$components = $wixXml.Wix.Fragment.ComponentGroup
WalkDirectory $wixXml.PSBase.SelectSingleNode("/wi:Wix/wi:Fragment/wi:DirectoryRef", $namespaceManager) $directory
$wixXml.Save("$build_dir\WebContent.wxs")
.\Build\WixWeb\bin\Candle.exe """-dProductName=Foo""`
""-dVersion=1.0.0.0""`
""-dProductID=0cd64670-5769-4e34-8b21-c6242e7ca5a2""`
""-dUpgradeCode=307601e9-4eea-4b5c-938a-354115d5c419""`
""-dAppPool=FooAppPool""`
""-dInstallDirectory=Foo""`
""-dWebAppDirectoryComponentId=CF57E626-1E95-4a89-A0E9-C1AD03C51B12""`
""-dIIsAppPoolComponentId=D9138380-19B3-4123-9E22-AB2994B1024B""`
""-dIIsWithAppPoolSettingsComponentId=02ca3f08-a1e8-48a3-b4d7-6f5f67c61b96""`
""-dI开发者_JAVA技巧IsWithoutAppPoolSettingsComponentId=d97791b0-f597-46c6-b159-541817527453""`
""-ext "".\Build\WixWeb\bin\WixIIsExtension.dll""""`
""-ext "".\Build\WixWeb\bin\WixUIExtension.dll""""`
"".\Build\WixWeb\Shell.wxs""`
"".\Build\stage\WebContent.wxs"" "
}
Try replacing your inner double quotes with single quotes, like so:
.\Build\WixWeb\bin\Candle.exe " ""-dProductName=Foo"" `
""-dVersion=1.0.0.0"" `
""-dProductID=0cd64670-5769-4e34-8b21-c6242e7ca5a2"" `
""-dUpgradeCode=307601e9-4eea-4b5c-938a-354115d5c419"" `
""-dAppPool=FooAppPool"" `
""-dInstallDirectory=Foo"" `
""-dWebAppDirectoryComponentId=CF57E626-1E95-4a89-A0E9-C1AD03C51B12"" `
""-dIIsAppPoolComponentId=D9138380-19B3-4123-9E22-AB2994B1024B"" `
""-dIIsWithAppPoolSettingsComponentId=02ca3f08-a1e8-48a3-b4d7-6f5f67c61b96"" `
""-dIIsWithoutAppPoolSettingsComponentId=d97791b0-f597-46c6-b159-541817527453"" `
""-ext '.\Build\WixWeb\bin\WixIIsExtension.dll'"" `
""-ext '.\Build\WixWeb\bin\WixUIExtension.dll'"" `
"".\Build\WixWeb\Shell.wxs"" `
"".\Build\stage\WebContent.wxs"" "
Futhermore, you might find it easier if you escape your double quotes correctly using `" (backtick followed by doublequote); the script might be more robust, too. The code sample would then become:
.\Build\WixWeb\bin\Candle.exe " `"-dProductName=Foo`" `
`"-dVersion=1.0.0.0`" `
`"-dProductID=0cd64670-5769-4e34-8b21-c6242e7ca5a2`" `
`"-dUpgradeCode=307601e9-4eea-4b5c-938a-354115d5c419`" `
`"-dAppPool=FooAppPool`" `
`"-dInstallDirectory=Foo`" `
`"-dWebAppDirectoryComponentId=CF57E626-1E95-4a89-A0E9-C1AD03C51B12`" `
`"-dIIsAppPoolComponentId=D9138380-19B3-4123-9E22-AB2994B1024B`" `
`"-dIIsWithAppPoolSettingsComponentId=02ca3f08-a1e8-48a3-b4d7-6f5f67c61b96`" `
`"-dIIsWithoutAppPoolSettingsComponentId=d97791b0-f597-46c6-b159-541817527453`" `
`"-ext '.\Build\WixWeb\bin\WixIIsExtension.dll'`" `
`"-ext '.\Build\WixWeb\bin\WixUIExtension.dll'`" `
`".\Build\WixWeb\Shell.wxs`" `
`".\Build\stage\WebContent.wxs`" "
YMMV, though.
I faced similar issue and eventually got what the problem. Every parameter separated with a space should be also treated as separate argument in powershell command
If this is an original command line that you write in cmd
.\Build\WixWeb\bin\Candle.exe ^
-dProductName=Foo ^
-dVersion=1.0.0.0 ^
-dProductID=0cd64670-5769-4e34-8b21-c6242e7ca5a2 ^
-ext .\Build\WixWeb\bin\WixIIsExtension.dll ^
.\Build\stage\WebContent.wxs
You could see that argument -dProductName=Foo is one argument but when we take a look at -ext .\Build\WixWeb\bin\WixIIsExtension.dll we could see that argument name and value are separated therefore these are 2 separate arguments that should be passed to candle.exe as 2 strings instead of single string. -ext is a positional argument and its value should be next after the argument-marker.
Correct version:
.\Build\WixWeb\bin\Candle.exe " `"-dProductName=Foo`" `
`"-dVersion=1.0.0.0`" `
`"-dProductID=0cd64670-5769-4e34-8b21-c6242e7ca5a2`" `
`"-ext`" `
`".\Build\WixWeb\bin\WixIIsExtension.dll'`" `
`".\Build\stage\WebContent.wxs`" "
精彩评论