You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同步IIS时如何通过msdeploy.exe CLI设置应用程序池

问题

我正在编写脚本,用于在两台IIS服务器上安装并同步指定应用,结合.bat与PowerShell实现:PowerShell脚本可在IIS-1上正常复制文件、配置设置并创建3个应用程序池,但通过msdeploy.exe同步至IIS-2后,子应用使用的是站点默认应用程序池,而非IIS-1上配置的对应独立池。因远程PowerShell存在认证问题,希望仅通过msdeploy.exe解决该问题。

现有bat脚本:

@echo OFF

rem 设置参数
set "webSiteName=SiteName"
set "siteRootDirectoryPath=C:\wwwroot"
set "ApiName=Api"
set "AppName=App"
set "psIntallScriptPath=C:\version\DeployApiAndAppToIIS.ps1"
set "psAppPoolScriptPath=C:\version\EnsureAppPool.ps1"
set "currentDirectory=%~dp0"

rem 调用带参数的PowerShell脚本
powershell -NoProfile -ExecutionPolicy Bypass -File "%psScriptPath%" -siteRootDirectory %siteRootDirectoryPath% -sourceDirectory %currentDirectory% -siteName %webSiteName% -appNames %ApiName%,%AppName%

rem 检查PowerShell脚本的退出码

if %ERRORLEVEL% NEQ 0 (
    if %ERRORLEVEL% NEQ 101 (
        echo "错误代码%ERRORLEVEL%:更新API和应用失败"
        pause
        exit /b %ERRORLEVEL%
    )
    if %ERRORLEVEL% EQU 101 (
    echo "未找到API/应用压缩包,将不执行安装"
    )
)
if %ERRORLEVEL% EQU 0 (
    echo "%webSiteName%的Api和应用已更新" 
)

rem 同步IIS站点
echo "将站点%webSiteName%同步至Web2"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:iisApp="%webSiteName%" -skip:Directory="\\Log$" -skip:Directory="\\%ApiName%" -dest:iisApp="%webSiteName%",computername=Web2

IF %ERRORLEVEL% NEQ 0 (
  echo "错误代码%ERRORLEVEL%:同步站点%webSiteName%至Web2失败"
  pause
  exit %ERRORLEVEL%
)

rem 为API创建独立的应用程序池
echo "为API %ApiName%创建应用程序池"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:appPoolConfig="%webSiteName%%ApiName%" -dest:appPoolConfig="%webSiteName%%ApiName%",computername=Web2

IF %ERRORLEVEL% NEQ 0 (
  echo "创建应用程序池失败,错误代码%ERRORLEVEL%"
  pause
  exit %ERRORLEVEL%
)

rem 同步API子应用并分配新应用程序池
echo "同步子应用HiCoreApi并分配其应用程序池"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:iisApp="%webSiteName%\%ApiName%" -skip:Directory="\\Log$" -dest:iisApp="%webSiteName%\%ApiName%",computername=Web2

IF %ERRORLEVEL% NEQ 0 (
  echo "错误代码%ERRORLEVEL%:同步站点%webSiteName%至Web2失败"
  pause
  exit %ERRORLEVEL%
)

pause

goto :eof
解决方案

问题根源在于原脚本使用iisApp提供者同步内容时,仅同步了文件和基础应用设置,未同步子应用与对应应用池的关联配置。以下两种方案可通过msdeploy.exe解决:

方案1:使用appHostConfig同步完整站点配置(推荐)

appHostConfig提供者会同步IIS站点的完整配置信息,包括子应用的应用程序池绑定。调整同步顺序,先确保目标服务器存在所有应用池,再同步站点配置:

修改后的同步部分脚本

rem 先同步所有关联的应用程序池到Web2
echo "同步站点及子应用的应用程序池至Web2"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:appPoolConfig="%webSiteName%" ^
-dest:appPoolConfig="%webSiteName%",computername=Web2

"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:appPoolConfig="%webSiteName%%ApiName%" ^
-dest:appPoolConfig="%webSiteName%%ApiName%",computername=Web2

"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:appPoolConfig="%webSiteName%%AppName%" ^
-dest:appPoolConfig="%webSiteName%%AppName%",computername=Web2

rem 同步完整站点配置(含子应用池关联)及内容,跳过无需同步的目录
echo "同步站点%webSiteName%配置与内容至Web2"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:appHostConfig="%webSiteName%" ^
-dest:appHostConfig="%webSiteName%",computername=Web2 ^
-skip:Directory="\\Log$"

rem 补充同步子应用的最新文件(如果appHostConfig未覆盖全部内容)
echo "同步Api子应用内容至Web2"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:iisApp="%webSiteName%\%ApiName%" ^
-dest:iisApp="%webSiteName%\%ApiName%",computername=Web2 ^
-skip:Directory="\\Log$"

echo "同步App子应用内容至Web2"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:iisApp="%webSiteName%\%AppName%" ^
-dest:iisApp="%webSiteName%\%AppName%",computername=Web2 ^
-skip:Directory="\\Log$"

关键说明

  • 先同步应用池:确保目标服务器存在所有需要的应用池,避免站点配置引用不存在的池导致错误。
  • appHostConfig:完整同步站点的IIS配置,包括子应用的应用程序池绑定关系,这是iisApp提供者不具备的能力。

方案2:同步子应用时显式指定应用池

如果不需要同步整个站点配置,可在同步子应用时通过-setParam参数直接指定应用池:

rem 为API创建独立的应用程序池
echo "为API %ApiName%创建应用程序池"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:appPoolConfig="%webSiteName%%ApiName%" -dest:appPoolConfig="%webSiteName%%ApiName%",computername=Web2

IF %ERRORLEVEL% NEQ 0 (
  echo "创建应用程序池失败,错误代码%ERRORLEVEL%"
  pause
  exit %ERRORLEVEL%
)

rem 同步Api子应用并强制指定应用程序池
echo "同步子应用%ApiName%并分配其应用程序池"
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^
-source:iisApp="%webSiteName%\%ApiName%" ^
-dest:iisApp="%webSiteName%\%ApiName%",computername=Web2 ^
-skip:Directory="\\Log$" ^
-setParam:name="Application Pool",value="%webSiteName%%ApiName%"

关键说明

  • -setParam参数直接覆盖目标服务器上子应用的应用池配置,无需依赖配置同步,适合仅调整单个子应用池的场景。

内容的提问来源于stack exchange,提问作者Adam Degerman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:54:58