PowerShell & MSDeploy - Arguments with Spaces

后端 未结 4 1034
予麋鹿
予麋鹿 2021-01-07 10:39

I cannot work out how to pass arguments that contain folders with spaces using msdeploy.exe and PowerShell v4.

Sample Powershell Script



        
相关标签:
4条回答
  • 2021-01-07 11:04

    I've found that this works:

    $arguments=@(
    "-verb:sync"
    ,"-source:metakey=lm/$IISSite,computername=$computer,includeAcls=true"
    ,"-dest:metakey=lm/w3svc/$DestSite"
    ,"-enableLink:appPool"
    ,"-allowUntrusted"
    ,"-skip:attributes.name=ServerBindings"
    ,"-skip:attributes.name=SecureBindings"
    #,"-whatif"
    )
    
    
    Write-Output "Running MSDeploy with the following arguments"
    $arguments
    $logfile="Sync_$(get-date -format yyyyMMdd-HHmm).log"
    Start-Process -FilePath "$msdeploy\msdeploy.exe" -ArgumentList $arguments -WorkingDirectory $msdeploy -RedirectStandardError "Error.txt" -RedirectStandardOutput $logfile -Wait -NoNewWindow
    
    0 讨论(0)
  • 2021-01-07 11:04

    Found an easy solution. Ref: http://answered.site/all-arguments-must-begin-with--at-cwindowsdtldownloadswebserviceswebservicesidservicepublishedwebsitesidservicedeploymentidservicewsdeployps123/4231580/

    $msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe"
    $msdeployArgs = @(
    "-verb:sync",
    "-source:iisApp='Default Web Site/HelloWorld'",
    "-verbose",
    "-dest:archiveDir='c:\temp1'"
    )
    Start-Process $msdeploy -NoNewWindow -ArgumentList $msdeployArgs
    
    0 讨论(0)
  • 2021-01-07 11:17

    When invoking commands PowerShell does some auto quoting that does not work well with MSDeploy. There are a couple of ways to avoid the auto quoting. One is to use the Start-Process cmdlet where you can specify the exact command line that you want but it can become a bit tedious to get the output of the new process to appear as output of the PowerShell script that you are running.

    Another option is to use the --% specifier to turn off PowerShell parsing. However, doing that will not allow you to use variables in the command line because - well, parsing has been turned off. But you can get around this by using the Invoke-Expression cmdlet to first build the command line including the --% and whatever variables you want and then let PowerShell evaluate it:

    $fl1 = "D:\space space\a.txt";
    $fl2 = "D:\space space\b.txt";
    $arguments = "-verb:sync -source:filePath=""$fl1"" -dest:filePath=""$fl2"""
    $commandLine = 'msdeploy.exe --% ' + $arguments
    Invoke-Expression $commandLine
    
    0 讨论(0)
  • 2021-01-07 11:25

    I used the suggestion from the following: How do you call msdeploy from powershell when the parameters have spaces?

    To derive a "cleaner" solution.

        $msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe";
    
        write-warning "WITHOUT SPACE"
        $fl1 = "d:\nospace\a.txt"
        $fl2 = "d:\nospace\b.txt"
    
        $md = $("`"{0}`" -verb:sync -source:filePath=`"{1}`" -dest:filePath=`"{2}`"" -f $msdeploy, $fl1, $fl2)
        cmd.exe /C "`"$md`""
    
        write-warning "WITH SPACE"
        $fl1 = "d:\space space\a.txt"
        $fl2 = "d:\space space\b.txt"
    
        $md = $("`"{0}`" -verb:sync -source:filePath=`"{1}`" -dest:filePath=`"{2}`"" -f $msdeploy, $fl1, $fl2)
        cmd.exe /C "`"$md`""
    
    0 讨论(0)
提交回复
热议问题