Web 部署 PowerShell 命令集

作者 :Owais Shaikh

Web 部署 V3.0 附带 PowerShell cmdlet,用于执行 Web 部署 API [Microsoft.Web.Deployment] 支持的大部分任务。 可以 在此处阅读有关此 API 的详细信息。 这些 cmdlet 位于名为 WDeploySnapin3.0 的 snapin 中,该管理单元在 Web 部署的典型安装或更高版本上安装并注册为管理单元。 若要使用这些 cmdlet,请在每次启动 PowerShell 控制台时添加加载项,或将加载项添加到 PowerShell 配置文件,以使所有控制台自动加载加载项。

若要在加载 PowerShell 控制台时添加,请在控制台窗口中运行以下命令:

Add-PSSnapin WDeploySnapin3.0

若要将其添加到 PowerShell 配置文件,请执行以下操作:

  1. 如果已有 PowerShell 配置文件,请转到步骤 4。
  2. 在“我的文档<”下>创建 WindowsPowerShell 文件夹。
  3. 创建名为 Microsoft.PowerShell_profile.ps1 的文件
  4. 将此行添加到 PowerShell 配置文件文件:“Add-PSSnapin WDeploySnapin3.0”

请注意以下几点:

  1. PowerShell 控制台在 64 位系统上以 64 位运行,除 Windows 8 及更高版本外,在 .Net 2.0 环境下运行。 如果遇到其中一个或两个问题,请参阅解决方案的故障排除部分。
  2. 创建 Web 部署包的所有 cmdlet 都会为最常用的任务创建参数,以及使用该包的 cmdlet 接受参数值。
  3. 只有一个删除 cmdlet 用于删除它下面的网站或应用。
  4. Web 部署具有参数,但它们与 PowerShell cmdlet 参数是相互独立的。 在本文档中引用参数时,它表示 cmdlet 参数。 Web 部署参数已被特别指明为 Web 部署参数。

I. 发布设置文件

下面提供的所有 cmdlet 都能够针对远程项目(如远程服务器或远程数据库)执行。 这些需要的不仅仅是凭据。 例如,您需要知道远程服务器的名称、远程数据库连接字符串,以及是否希望允许使用测试证书发布到服务器等。为了方便申请,将凭据信息从服务器管理员传递给使用者等,出现了一种新的文件类型,用于将这些设置组合在一起。 此文件称为以 .publishsettings 结尾的发布设置文件。 这是被 Visual Studio 和 WebMatrix 用于发布的。

若要能够创建此类文件供其他 cmdlet 使用,并编辑 它,可以使用 New-WDPublishSettings cmdlet。 如果未指定文件名,则会在文档目录中使用名称 <新的 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

第二节 备份

所有备份 cmdlet 都有一个位置参数,称为“输出”。 除了 backup-wdserver(它的第一个位置参数为“输出”)之外,这通常是第二个位置参数。 这会获取要在其中创建备份的文件夹的路径。 备份始终是 Web 部署 ZIP 包。 可以在 包提供程序上了解有关 Web 部署包的详细信息。 如果未指定路径,则会在用户文档文件夹下的名为“Web 部署备份”的文件夹中创建备份。 备份文件的命名格式为machinename_nameofproviderused_[Siteorapporfoldername(可选)]_timestamp.zip。

默认情况下,所有这些 cmdlet 都将在本地执行,除非通过将发布设置文件传递到 SourcePublishSettings 参数来提供远程服务器信息。

答: IIS

所有 IIS cmdlet 都将适用于已安装的 IIS 版本 7 或更高版本

1. 服务器

Backup-WDServer

说明:不带任何参数即可备份运行此命令的当前服务器。 它为该操作使用了著名的网络服务器提供商。 因此,创建的包包含 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 可用于创建没有内容的备份。 如果站点使用非默认应用池,则使此包在其他可能没有相同应用程序池的服务器上运行,请使用 switch 参数 includeAppPool。 这会将应用程序池捆绑到包中。

自动生成的 Web 部署参数:创建两种类型的参数:

  1. 一个参数,使用户能够更改将应用站点备份的站点的名称。
  2. 另一个参数,使用户能够更改网站的物理路径以及该网站下的每个 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

叁. 还原

所有还原 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 创建一个包,那么当我在不为包内参数提供任何数值的情况下使用 restore cmdlet 还原该包时,site1 的内容和配置将被包中的信息覆盖。所有的还原 cmdlet 都将以相同的方式运作。

所有这些 cmdlet 都默认在本地还原,除非指定了目标发布设置文件,在这种情况下,会通过 Web 管理服务(WMSvc)或 Web 部署代理服务,在远程服务器上执行相同的操作。

答: IIS

1. 服务器

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 站点包。 如果包有两个名为“站点物理路径”和“站点名称”的参数,它们将公开为 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 Server Default 网站上安装 WordPress 作为名为 WordPress 的应用程序,可以将 WordPress 包从应用图库下载到一个名为 packages 的文件夹中。 wordpress 包参数的所有默认值将按原样工作,但只需为两个必需参数指定值:管理员和非管理员 mysql 密码。

参数:

Restore-WDPackage c:\Packages\wordpress.zip -DBAdminPassword mysecretserverpassword –DBPassword mysqllocalpassword

四. 删除

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

六。 设置 WDACL

此 cmdlet 可用于在网站内容上设置访问控制列表 (ACLs)。 例如,比方说我有一个网站 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

七。 Invoke

可以使用 destinationpublishsettings 在远程系统上调用命令或脚本,并实时查看远程执行的结果。 你必须是远程系统上的管理员才能远程执行 runcommand 提供程序。 可以 在此处阅读有关此提供程序的详细信息。 MWD Api 等待给定脚本或命令完成的默认最长时间为 5 秒。 如果要增加这次执行时间,可以为 waitInterval 和 waitAttempts 指定更高的值,如以下示例所示。

答: 脚本

Invoke-WDScript C:\my.cmd –Verbose

这将执行脚本,如果使用详细方式运行命令,你将能够看到命令的输出。

B. 命令

$settings = @ { waitInterval = 3000; waitAttempts = 25;}
Invoke-WDCommand "dir c:\mydirectory /s/b" -DestinationSettings $settings

这将执行该命令,并且不显示任何输出,因为未指定详细内容。 但是,这将在每次超时之间等待 3 秒,并执行 25 次等待迭代。 总之,进程执行最多会持续 75 秒。

八。 同步

这些 cmdlet 负责对源和目标进行同步。 源代码永远不会被修改。 我使用“数据源”而不是“客户端”这个词的原因是“客户端”和“服务器”在数据同步时容易引起混淆。 你可以将本地服务器与远程服务器同步。 在这种情况下,远程服务器是源服务器,本地服务器是目标。 或者,你可以在计算机 1 上执行 PowerShell cmdlet,并同步计算机 2 和 3。 若要使用远程源和/或目标,您需要提供一个发布设置文件,该文件可以使用本文件中首先提到的 cmdlet 创建。所有同步 cmdlet 还支持 sourceSettings 和 destinationSettings 参数,以便有选择地设置源、目标或两者的提供者配置。

答: IIS

1. 服务器

我想同步两个 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. 网站

在以下命令中,如果站点 2 不存在,则会创建 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 部署包备份和还原数据库,但是,还可以将数据库同步到.sql脚本或直接同步到另一个数据库实例(使用 Sync-WDSQLDatabase 和 Sync-WDMySQLDatabase cmdlet)。

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 支持的常规清单提供程序同步。 可以 在此处阅读有关它的详细信息。 Manifest 是一个 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