Web 部署 PowerShell Cmdlet
作者:Owais Shaikh
Web 部署 V3.0 附带 PowerShell cmdlet,用于执行 Web 部署 API [Microsoft.Web.Deployment] 支持的大部分任务。 你可以在此处阅读有关该 API 的详细信息。 这些 cmdlet 位于名为 WDeploySnapin3.0 的管理单元中,该管理单元在典型或更高版本的 Web 部署安装中安装并注册为管理单元。 若要使用这些 cmdlet,请在每次启动 PowerShell 控制台时添加该管理单元,或将该管理单元添加到 PowerShell 配置文件,以使所有控制台自动加载它。
若要在加载 PowerShell 控制台时添加,请在控制台窗口中运行以下命令:
Add-PSSnapin WDeploySnapin3.0
若要将其添加到 PowerShell 配置文件,请执行以下操作:
- 如果已有 PowerShell 配置文件,请转到步骤 4。
- 在“我的文档”下创建 WindowsPowerShell 文件夹<>。
- 创建名为 Microsoft.PowerShell_profile.ps1 的文件
- 将此行添加到 PowerShell 配置文件文件:'Add-PSSnapin WDeploySnapin3.0'
请注意以下几点:
- PowerShell 控制台在 64 位系统上以 64 位形式运行,且在 Windows 8 之前都在 .Net 2.0 中运行。 如果遇到这两方面的问题,请参阅疑难解答部分以寻找解决方案。
- 创建 Web 部署包的所有 cmdlet 都会为最常用的任务创建参数,使用这些内容的 cmdlet 会接受参数值。
- 只有一个删除 cmdlet 用于删除它下面的网站或应用。
- Web 部署具有参数,但它们与 PowerShell cmdlet 参数是正交的。 本文档中提到的参数指的是 cmdlet 参数。 Web 部署参数则专门称为 Web 部署参数。
I. 发布设置文件
下面提供的所有 cmdlet 都能够针对远程项目(例如远程服务器或远程数据库)执行。 这需要的不仅仅是凭据。 例如,需要远程服务器名称、远程数据库连接字符串、是否允许使用测试证书发布到服务器等。为方便使用,将凭据信息从服务器管理员传输到使用者等,这里引出了一种新的文件类型,可集合这些设置。 此文件名为发布设置文件,以 .publishsettings 结尾。 此文件被 Visual Studio 和 WebMatrix 用于发布。
若要创建此类文件以供其他 cmdlet 使用并编辑它,可以使用 New-WDPublishSettings cmdlet。 如果未指定文件名,则会在文档目录中创建名称为 <new guid>.publishsettings 的新文件。 创建文件时将显示此路径。 如果指定了文件名,并且该文件不存在,则会在路径指定的文件夹中创建该文件,但该文件的路径必须有效。 如果文件存在,则只有在运行命令时指定的属性值将被修改,文件中未知的属性将被删除
示例:此示例获取凭据对象,然后将其传递给新的发布设置文件 cmdlet 以及其他参数
$cred = Get-Credential
New-WDPublishSettings -ComputerName owais-1 -Site Site1 -Credentials $cred -AllowUntrusted -SiteUrl "https://www.mywebsite.com" -FileName C:\pprofiles\mywebsite.publishsettings -AgentType wmsvc
Get-WDPublishSettings cmdlet allows to load values from a publish setting file into PublishSettings object.
$publishsettings=Get-WDPublishSettings C:\pprofiles\mywebsite.publishsettings
II. 备份
所有备份 cmdlet 都有一个名为 output 的位置参数(这是第二参数,仅在 backup-wdserver 中为第一个位置参数)。 这会获取要在其中创建备份的文件夹的路径。 备份始终是 Web 部署 zip 包。 可以在包提供程序上了解有关 Web 部署包的详细信息。 如果未指定路径,则会在用户文档文件夹下名为“Web 部署备份”的文件夹中创建备份。 备份命名为 machinename_nameofproviderused_[Siteorapporfoldername(Optional)]_timestamp.zip。
默认情况下,所有这些 cmdlet 都将在本地工作,除非通过在发布设置文件中传递 SourcePublishSettings 参数来提供远程服务器信息。
A. IIS
所有 IIS cmdlet 都将适用于已安装的 IIS 版本 7 或更高版本
1.Server (服务器)
Backup-WDServer
说明:这会不带任何参数地备份运行该命令的当前服务器。 它对此操作使用已知的 Web 服务器提供程序。 因此,创建的包包含 Web 服务器包中包含的所有项目。 可以在此处阅读有关此提供程序的详细信息。
Cmdlet 参数:ConfigOnly 参数允许排除所有内容,而 SkipFileList 和 SkipFolderList 参数允许有选择地从包中排除一个或多个文件或文件夹。
示例:
这将为 Web 服务器备份除指定内容以外的所有内容:
Backup-WDServer -SourcePublishSettings c:\profiles\myserver.publishsettings -ConfigOnly
创建应跳过的文件的列表。 这是标准正则表达式。
$list = @('\\site2\\iisstart.htm','\\site2\\welcome.png')
Backup-WDServer –SkipFileList $list
还可以通过将列表更改为 $list=@('\site2\') 来更改此项以跳过 site2 下的所有文件
2.网站
Backup-WDSite
说明:这将使用 apphostconfig 提供程序备份 IIS 站点及其设置和内容。 可以在此处阅读有关此提供程序的详细信息。
Cmdlet 参数:备份由站点参数或发布设置文件指定的站点的名称。 站点参数值会覆盖发布设置中的站点名称。
ConfigOnly 可用于创建没有内容的备份。 如果站点使用非默认的应用池,那么要使该包在其他可能没有相同应用池的服务器上工作,请使用开关参数 includeAppPool。 这会将应用程序池捆绑到包中。
自动生成的 Web 部署参数:创建两种类型的参数:
- 一种参数让用户能够更改将应用站点备份的站点的名称。
- 另一种参数让用户能够更改站点的物理路径以及该站点下的每个 Web 应用程序。
因此,如果我有一个站点,下面有三个应用,我会得到 4 个单独的物理路径参数和一个站点名称参数。
示例:
Backup-WDSite "Default Web Site" -ConfigOnly
Backup-WDSite MySite –IncludeAppPool
Backup-WDSite MySite -SkipFileList $list
3.Web 应用程序
Backup-WDApp
说明:这将使用 iisApp 提供程序备份 Web 应用程序。 请在此处阅读有关此提供程序的详细信息。 该文章很好地介绍了 Web 应用程序的概念,以及站点、应用和 IIS 中的虚拟目录之间的差异。
Cmdlet 参数:备份由应用程序参数或发布设置文件指定的应用的名称。 如果未指定其中任何一个,则会引发错误。 应用程序参数值会覆盖发布设置中的站点名称。 SkipFileList 和 SkipFolderList 参数允许有选择地从包中排除一个或多个文件或文件夹。
自动生成的 Web 部署参数:创建用于在还原或安装期间更改应用或站点名称的参数。
$list = @('\\iisstart\.htm')
Backup-WDApp "Default web site/app" -SkipFileList $list
B. 数据库
1.MSSql
Backup-WDSqlDatabase
说明:这将使用 dbfullsql 提供程序备份 Microsoft SQL Server 数据库。 此提供程序使用 SMO 编写数据库脚本,并公开 100 多个提供程序设置来控制编写数据库脚本的方式。 此处对这一点进行了详细的介绍。
Cmdlet 参数:备份发布设置文件中由数据库参数或 SQLServerDBConnectionString 指定的连接字符串。 数据库参数值会覆盖发布设置中的 SQLServerDBConnectionString。 可以使用 SourceSettings 参数传递由此 dbfullsql 提供程序公开的提供程序设置。 Scriptdropsfirst 是一项很常用的设置,如果对象存在,则编写删除对象脚本。 SMO 脚本选项中的另一个提供程序设置是将 scriptdata 设置为 false,以便仅提取架构。
自动生成的 Web 部署参数:为在还原或安装期间更改数据库连接字符串创建参数
示例:
New-WDPublishSettings -ComputerName serverName -MSSqlConnectionString "Data Source=localhost;Initial Catalog=MyDb;User id=MyDbUser;Password=MyPassword" -FileName d:\SQLdb.PublishSettings -Credential serverName\Administrator
Backup-WDSQLDatabase -SourcePublishSettings D:\SQLdb.PublishSettings
Backup-WDSQLDatabase -Database "Data Source=localhost;Initial Catalog=MyDb;User id=MyDBUser;Password=MyPassword" -SourceSettings @{ copyAllUsers='false'; scriptDropsFirst='true'; }
2.MySql
Backup-WDMySQLDatabase
说明:这将使用 dbmysql 提供程序备份 MySql Server 数据库。 此提供程序使用 mysqldump 编写数据库脚本。 此处对这一点进行了详细的介绍。
Cmdlet 参数:备份发布设置文件中由数据库参数或 mySQLDBConnectionString 指定的连接字符串。 数据库参数值会覆盖发布设置中的 mySQLDBConnectionString。 可以使用 SourceSettings 参数传递提供程序设置。 常用的设置有 includeData 和 includeSchema。 默认情况下,这些属性设置为 true。
自动生成的 Web 部署参数:为在还原或安装期间更改数据库连接字符串创建参数
New-WDPublishSettings -ComputerName serverName -MySqlConnectionString "Data Source=localhost;database=MyDb;Uid=MyDbUser;pwd=MyPassword" -FileName d:\MySQLdb.PublishSettings -Credential serverName\Administrator
Backup-WDMySQLDatabase -Database 'Server=localhost;Database=MyDb;Uid=MyDbUser;pwd=MyPassword’
Backup-WDMySqlDatabase –SourcePublishSettings d:\mysqldb.publishsettings
III. 还原
所有还原 cmdlet 都采用 Web 部署包作为第一个位置参数进行还原。
WebDeploy 支持包的参数化概念,这样在还原期间就能在不更改包的情况下更改一些方面。 例如,在还原期间,可以选择指定数据库连接字符串的值,该值不同于使用 WebDeploy 参数的包内部的值(要求包中存在连接字符串参数)。
根据包的生成方式,Web 部署包可能具有一个或多个参数。 这些还原 cmdlet 检查包并将动态 PowerShell 参数添加到集合。 因此,如果包具有名为“Parameter1”的 Web 部署参数,则会找到名为“Parameter1”的 PowerShell 参数。 但动态参数在 PowerShell 中有自己的问题,只有在包名称或文件路径中没有空格时,才会起作用。
或者,所有这些还原 cmdlet 也有一个“Parameters”参数,可用于在还原期间手动指定新的参数值。 此“Parameters”参数采用 PowerShell 字典对象作为 Web 部署参数的名称值对。
若要了解 Web 部署包中定义的 Web 部署参数,只需在 Windows 资源管理器中打开 zip 文件,并检查包根目录中存在的 parameters.xml 文件。 需要为所有没有默认值或值的 Web 部署参数指定值。 在 xml 文件中添加所有这些参数,并将其作为 ParameterValuesFile 参数的值传入。 可以按此处提供的内容生成此文件,也可以手动生成。 格式为
<parameters>
<setParameter name="name1" value="value1" />
<setParameter name="name2" value="value2" />
</parameters>
Get-WDParameters cmdlet 可以读取此文件并将其转换为 WebDeploy 参数对象(字典),所有还原 cmdlet 都接受它。
如果恢复了某个包而没有为其中的参数指定值,则默认行为将覆盖最初创建包的资源。 例如,如果我使用 backup-wdsite site1 从 site1 创建包,那么当我使用还原 cmdlet 还原此包而不向此包中的参数提供任何值时,site1 将被该包中包含的任何内容(从内容到配置)覆盖。所有还原 cmdlet 都是如此。
所有这些 cmdlet 都在本地还原,除非指定了目标发布设置文件,在这种情况下,将通过 Web 管理服务 (WMSvc) 或 Web 部署代理服务对远程服务器执行完全相同的操作。
A. IIS
1.Server (服务器)
Restore-WDServer
说明:还原 Web 服务器包。 常见用法是在进行更改之前备份服务器,如果出现故障,可以通过应用在进行更改之前创建的 Web 部署备份包来还原服务器。
$folderList = @(‘\\app_data’)
Restore-WDServer D:\OWAIS-1_WebServer_20120419121214.zip -DestinationPublishSettings c:\destinationServer.publishSettings –SkipFolderList $folderList
2.网站
Restore-WDSite
说明:还原 IIS 站点包。 如果包有两个名为“Site Physical Path”和“Site Name”的参数,它们将公开为 SitePhysicalPath 和 SiteName 动态 powershell 参数。 此命令将创建物理路径为 c:\site1
的新站点 site1。 如果未为这些参数指定任何值,还原将应用于同一站点和内容,覆盖站点中可能所做的任何更改。
参数:在复制站点内容时,你可能需要使用 skipfolderlist 和 skipfilelist 来排除某些文件夹和/或文件。
Restore-WDSite C:\defaultsite.zip -SitePhysicalPath c:\site1 -SiteName site1
Restore-WDSite -Package 'D:\Users\Administrator\Documents\Web Deploy Backups\IIS-Server_AppHostConfig_Default Web Site_20120417100827.zip' -skipFolderList @('App_Data') -verbose
3.应用
Restore-WDApp
说明:这将还原 Web 应用程序。 Backup-WDApp 使用一个参数创建包,以在安装时更改应用的名称。 这可用于在还原期间将应用还原到其他应用。 部署到站点下的应用时,该站点必须存在。 此包会创建应用,但不会创建站点。
示例:
Restore-WDApp C:\myappbackup.zip -ApplicationPathParam1 "Default web site\app1"
B. 数据库
Restore-WDDatabase
说明:如果数据库不存在,则会创建一个名为客户的新数据库(只要当前用户具有此操作的权限),并对该数据库执行脚本。 如果在没有任何动态 Web 部署参数值的情况下运行此操作,则将覆盖创建此包的原始数据库。 请注意,如果在创建包时未使用 scriptDropsFirst 设置,那么应用到具有冲突的现有内容的数据库时将会失败。 此 cmdlet 可用于还原 MSSql 或 MySQL 备份。 只能使用通过 Backup-WDSQLDatabase 创建的备份来还原 MS SQL 数据库,以及使用通过 Backup-WDMySqlDatabase 创建的备份还原 My SQL 数据库。
示例:
Backup-WDSqlDatabase "server=.\sqlexpress;integrated security=SSPI;database=customers" "C:\dbbackup.zip"
Restore-WDDatabase c:\dbbackup.zip –DatabaseConnectionStringParam1 "server=.\sqlexpress;integrated security=SSPI;database=customers_copy"
Backup-WDMySqlDatabase "server=localhost;uid=someuser;pwd=somepwd;database=coolDb" "C:\dbbackup.zip"
Restore-WDDatabase c:\dbbackup.zip –DatabaseConnectionStringParam1 "server=localhost;uid=someuser;pwd=somepwd;database=coolDb_copy"
°C 通用包
Restore-WDPackage
说明:此 cmdlet 可用于应用任何 Web 部署包。 可通过多种方式创建或获取 Web 部署包,例如,下载开放源代码应用程序库包、在 Visual Studio 中创建包、使用 msdeploy.exe 命令行工具(更多信息)或使用文档前面提到的 Backup-WD* cmdlet。 例如,要在 IIS 服务器默认网站上安装 wordpress 作为名为 wordpress 的应用,请从应用库将 wordpress 包下载到名为包的文件夹。 wordpress 包参数的所有默认值将按原样生效,但只需为两个必需参数指定值:管理员和非管理员 mysql 密码。
参数:
Restore-WDPackage c:\Packages\wordpress.zip -DBAdminPassword mysecretserverpassword –DBPassword mysqllocalpassword
IV. 删除
Remove-WDSite -Site NonWorkingSite
此命令将删除 applicationHost.config 中名为 nonworkingsite 的站点的定义以及站点的目录内容
V. 获取和设置应用池框架
通过这些 cmdlet,可以读取和更改 apppool .Net Framework 版本。
Get-WDAppPoolFx "default web site"
managedRuntimeVersion
---------------------
v2.0
Set-WDAppPoolFx "default web site" -AppPoolFrameworkVersion v4.0
Get-WDAppPoolFx "default web site"
managedRuntimeVersion
---------------------
v4.0
VI. 设置 WDACL
此 cmdlet 可用于设置站点内容的 ACL。 例如,假设我有一个站点 site1,且我试图向用户 u1 提供读取访问权限。
首先是检查当前权限。
$ret = Get-Acl C:\site1
$ret.Access
I don’t see u1 in the list. Let me give the user u1 access as follows
Set-WDAcl "site1" -SetAclUser u1
Check whether this worked
$ret = Get-Acl C:\site1
$ret.Access
I see that u1 has been given read access as below. [I have not pasted the other permissions on this folder. Just the u1 part]
FileSystemRights : Read, Synchronize
AccessControlType : Allow
IdentityReference : MOSHAIKH1\u1
IsInherited : False
InheritanceFlags : ContainerInherit, ObjectInherit
PropagationFlags : None
VII. Invoke
可以使用 destinationpublishsettings 在远程系统上调用命令或脚本,并实时查看远程执行的结果。 你必须是远程系统上的管理员才能远程执行 runcommand 提供程序。 可以在此处阅读有关此提供程序的详细信息。 MWD Api 等待给定脚本或命令完成的默认最长时间为 5 秒。 如果要增加这次执行时间,可以为 waitInterval 和 waitAttempts 指定更高的值,如以下示例所示。
A. 脚本
Invoke-WDScript C:\my.cmd –Verbose
这将执行脚本,如果使用详细模式运行该命令,将看到命令的输出。
B. 命令
$settings = @ { waitInterval = 3000; waitAttempts = 25;}
Invoke-WDCommand "dir c:\mydirectory /s/b" -DestinationSettings $settings
这将执行该命令,并且不显示任何输出,因为未指定详细模式。 但这将在每次延时之间等待 3 秒,并执行 25 次等待迭代。 总之,该进程执行最多会持续 75 秒。
VIII. Sync
这些 cmdlet 采用源和目标并在它们之间同步。 源永远不会修改。 这里我采用“源”一词而不是“客户端”,因为客户端和服务器在同步中是非常容易混淆的两个词。 你可以将本地服务器与远程服务器同步。 在这种情况下,远程服务器是源服务器,而本地服务器是目标。 或者,可以在计算机 1 上执行 PowerShell cmdlet 并同步计算机 2 和 3。 若要使用远程源和/或目标,需要提供一个发布设置文件,可以使用本文档中提到的第一个 cmdlet 创建该文件。所有同步 cmdlet 还支持 sourceSettings 和 destinationSettings 参数,以便有选择地为源或目标(或两者)设置提供程序设置。
A. IIS
1.Server (服务器)
我想同步两个 IIS 7.5 服务器:Owais-1 和 Owais-2。 我将首先为每个文件创建一个 publishsettings 文件,然后同步服务器。 由于我未指定凭据,因此如果我是这两个系统上的管理员,则此操作将成功。
New-WDPublishSettings -ComputerName owais-1 -AgentType MSDepSvc -FileName c:\owais1.publishsettings
Publish settings file created at: 'c:\owais1.publishsettings'.
New-WDPublishSettings -ComputerName owais-2 -AgentType MSDepSvc -FileName c:\owais2.publishsettings
Publish settings file created at: 'c:\owais2.publishsettings'.
Sync-WDServer -SourcePublishSettings c:\owais1.publishSettings -DestinationPublishSettings c:\owais2.publishSettings
2.网站
在以下命令中,如果 site2 不存在,则会创建 site2,并且我也更改了物理路径(因此内容将复制到新文件夹 c:\site2
)和网站的绑定。
Sync-WDSite site1 Site2 -SitePhysicalPath c:\site2 -SiteBinding "*:8078:" -IncludeAppPool
3.应用
我有一个在默认网站下运行的应用程序。 我想将该应用程序移动到 Site1 下。 以下命令可以完成该操作。
Sync-WDApp "Default Web Site/drupal" "site1/drupal"
现在我已经测试好新 drupal 应用的运行状况,我将删除默认网站下的原始 drupal 应用。
Remove-WDSite "Default Web Site/drupal"
B. 数据库
前面的 cmdlet 演示了如何使用 Web 部署包备份和还原数据库,不过还可以使用 Sync-WDSQLDatabase 和 Sync-WDMySQLDatabase cmdlet 将数据库与 .sql 脚本同步或直接同步到另一个数据库实例。
1.MSSql
Sync-WDSQLDatabase "server=.\sqlexpress;uid=sa;pwd=********;database=umbracodb" "server=.\sqlexpress;uid=sa;pwd=************;database=sometestdb"
这将创建一个名为 sometestdb 的新数据库(如果尚不存在),并同步架构和数据。
Sync-"server=.\sqlexpress;uid=sa;pwd=********;database=umbracodb" c:\umbraco.sql
这将在上面给出的路径中将 umbracodb 数据库脚本化为 umbraco.sql。
2.MySql
Sync-WDMySQLDatabase "server=localhost;uid=root;pwd=********;database=wordpress265" "server=localhost;uid=root;pwd=************;database=wordpress265_new"
这将创建一个名为 wordpress265_new 的新数据库(如果尚不存在),并同步架构和数据。
Sync-WDMySQLDatabase "server=localhost;uid=root;pwd=***************;database=wordpress265" c:\wordpress.sql
这将在上面给出的路径中将 wordpress265 数据库脚本化为 wordpress.sql。
°C 其他
对于上述其他 cmdlet 未涵盖的常规用途同步,可以使用 Sync-WDManifest cmdlet。 这是 MWD API 支持的常规清单提供程序同步。 可以在 此处阅读详细内容。 清单是 xml 文件中提供程序、提供程序路径和提供程序设置的集合。 在结构上,xml 文件的根节点被视为用于当前同步的提供程序的名称。因此它不能是该列表中提供的已知提供程序的名称。 其次,它可以有子节点,其元素名称与需要包含在同步中的提供程序相匹配。路径属性表示该提供程序的路径,并且是必需的。 其次,请为需要用于当前同步操作的每个提供程序设置添加属性值对。
此 cmdlet 需要两个清单:一个用于源,一个用于目标。 清单始终按指定的顺序执行。 如果提供程序支持提交操作(例如与 IIS 站点配合使用的 apphostconfig 提供程序),那么除非同步完成,否则不会调用提交。 因此,如果提供程序期望某个站点存在于创建它的提供程序之后,这将失败,因为该站点尚未提交。 在以下示例中,我将同步一个应用,并在清单中包含该应用使用的数据库。
源清单:
<demoManifest>
<iisApp path="Site1" />
<dbfullsql path="server=.\sqlexpress;integrated security=SSPI;database=customers" />
</demoManifest>
目标清单:
<demoManifest> <iisApp path="Site2" /> <dbfullsql path="server=.\sqlexpress;integrated security=SSPI;database=customers_demo_cpy" /></demoManifest>Sync-WDManifest C:\sourceManifest.xml C:\destManifest.xmlWARNING: Cannot connect to the database 'customers_demo_cpy'.Retrying operation 'Add' on object dbFullSql (server=.\sqlexpress;uid=sa;database=customers_demo_cpy). Attempt 1 of 5.Manifest : C:\sourceManifest.xmlManifest-Dest : C:\destManifest.xmlTimeTaken : 0:10Errors : 0Warnings : 0BytesCopied : 0ObjectsDeleted : 0ObjectsUpdated : 0ObjectsAdded : 3TotalChanges : 3ParameterChanges : 0