Windows PowerShell 和 IIS 7.0 简介
作者:Saad Ladki
介绍
Windows PowerShell 是 Microsoft 的 shell 和脚本语言。 这篇短文简要介绍了 Windows PowerShell 和 IIS。 阅读本文后,你将深入了解 Windows PowerShell 是什么,了解 Windows PowerShell 与 IIS 之间的关系,并了解 Windows PowerShell 执行 IIS 管理任务的一些简化方法。
本文提供的信息对 IT 管理员、软件开发人员、软件测试人员和管理人员非常有用。 即使是怀疑论者也坚定认为 Windows PowerShell 是一种必备工具。
关于 Windows PowerShell
Windows PowerShell 是 Microsoft 的综合下一代 shell 环境和脚本语言。 Windows PowerShell 是对旧 cmd.exe 命令行界面和 .BAT 文件的重大升级。 用户可能会问,既然 Cmd.exe 运行良好,为什么还要有一个新的命令行界面,而且也缺少学习另一种脚本语言的时间。 Windows PowerShell 是对以前的 Microsoft 命令行脚本技术的改进,这意味着 Windows PowerShell 更容易用于简单和复杂的任务,并且非常容易学习。
Windows PowerShell 中的一些改进包括:
- 更新的且一致的脚本语言
- 内部正则表达式功能
- 调用 .NET Framework、WMI 扩展和 Windows 注册表的功能
本部分提供具体示例并重点介绍 Windows PowerShell 的一些功能。 在以下部分中,将讨论 Windows PowerShell 如何与 IIS 配合使用。
要了解 Windows PowerShell,请看一个示例。 请查看图 1 中的屏幕截图。
图 1 - Windows PowerShell 基础知识
首先,可以注意到 Windows PowerShell 中的 shell 看起来像传统的 Windows 命令提示符。 经过短暂的熟悉期后,使用 Windows PowerShell 很快就会变得非常自然。
第一个命令是:
PS C:\> set-location Data
将调用 Windows PowerShell cmdlet(发音为“command-let”),将当前工作目录从 C:\
更改为 C:\Data
。 它与旧 cd (change directory) 命令的功能等效。 你可能会注意到,每次更改当前目录时都必须键入“set-location”,要键入太多次了;没错。
Windows PowerShell 提供了大量的快捷方式别名供你使用。 set-location cmdlet 的别名为 sl(完整 cmdlet 名称的缩写版本)和 cd(“旧”方式)。 本文使用 cmdlet 名称的完整版,以方便阅读。
第二个命令是:
PS C:\Data> get-childitem Pow*
将列出当前目录中以“Pow”开头的内容。 Windows PowerShell 不区分大小写,因此你可以键入 Get-ChildItem 或 GET-ChildItem。 本文全部使用小写。 get-childitem cmdlet 别名为 dir(对于熟悉 Windows 的用户)和 ls(对于 Unix 用户),别名为 gci 可方便键入。
接下来,使用 copy-item cmdlet 将 Windows PowerShell 目录(包括所有子目录)复制到名为 PSBackup 的新目录:
PS C:\Data> copy-item 'PowerShell' 'C:\Data\PSBackup' -recurse –force
然后使用 remove-item cmdlet 立即删除新创建的目录及其所有内容:
PS C:\Data> remove-item PSBackup –recurse
下一个命令使用 get-content cmdlet 获取 Hello.txt 文件的内容,然后通过管道传输(使用“|”字符)到 out-file cmdlet 将这些内容保存到当前目录中的新 HelloCopy.txt 文件中:
PS C:\Data> get-content 'Hello.txt' | out-file '.\HelloCopy.txt'
倒数第二个命令使用 get-content 显示新文件的内容:
PS C:\Data> get-content HelloCopy.txt
get-content cmdlet 大致相当于 type (Windows) 或 cat (Unix) 命令。 通过使用 sl 别名将工作目录更改为根驱动器来完成这个小演示:
PS C:\Data> sl \
现在,如果 Windows PowerShell 只是使用一组新命令执行常见的文件系统导航和操作任务,那么继续阅读下去毫无意义。 简短的一段介绍可能会导致这种错误的假设。 但是,与目前的许多 shell 环境相比,Windows PowerShell 具有很多优势。
结束这部分 Windows PowerShell 介绍性讨论:Windows PowerShell 有一个学习曲线。 除非有办法快速学习新技术,否则新技术将是毫无用处。 程序员将这一过程称为可发现性。 Windows PowerShell 的设计具有出色的可发现性特征,因此更易于学习。
例如,只需在 Windows PowerShell 提示符中键入 get-command 即可获取所有 cmdlet 的列表。 还可以通过键入 get-help 后跟 cmdlet 名称获取有关特定 cmdlet 的详细信息。 向工程师和管理人员教授 Windows PowerShell 的丰富经验表明,大多数工程师通过一天的练习就可以熟练使用 Windows PowerShell。
典型 IIS 环境中的 Windows PowerShell
本文的上一部分简要介绍了 Windows PowerShell。 然而,使用 Windows PowerShell 的真正优势在于 Windows PowerShell 与 IIS 交互和管理 IIS 的功能。 阅读本文的工程师可能对“最新和最好的”说法持怀疑态度。 本文将简要介绍 Windows PowerShell 背后的强大功能:许多 IIS 管理任务可以使用 Windows PowerShell 命令和脚本以及 IIS GUI 工具来完成。
借助 IIS,现在可以使用以下任一工具执行多个管理任务:
- 图形用户界面 (GUI)
- 交互式 Windows PowerShell 命令
- Windows PowerShell 脚本
拥有使用 shell 和脚本管理服务器软件的丰富经验的用户不需要更多的激励;但是习惯仅使用 GUI 工具的用户可能会问,当他们使用 MMC 管理得足够好时,通过命令行或脚本来管理 IIS 有什么特别之处。 本文结尾处指出了使用 Windows PowerShell 管理 IIS 的六大优势。
以下是一些基于 Windows PowerShell 架构师 Jeffrey Snover 和 IIS 产品部门经理 Bill Staples 的网络广播的 Windows PowerShell 示例。
假设你想要查看计算机上正在运行的与 IIS 相关的服务,这是一项非常常见的任务。 执行此操作的一种“GUI 方法”是启动 MMC,然后展开“服务和应用程序”类别,选择“服务”类别。 结果类似于图 2 中的屏幕截图。
图 2 - 使用 MMC 获取服务信息
使用 Windows PowerShell 列出 Windows 服务非常简单。 例如,在 Windows PowerShell 提示符中,使用 get-service cmdlet:
PS C:\> get-service
这并没什么特别,但假设你希望只列出以字母“w”开头的服务并按状态对其进行排序。 一种实现途径是:
PS C:\> get-service -include w* | sort-object -property status
可以将此命令解释为提取所有 Windows 服务信息,然后进行筛选以仅包含名称以字母“W”开头的服务;然后,根据服务状态(正在运行、已停止、已暂停)对这些结果进行排序。 结果类似于图 3 中的屏幕截图。
图 3 - 使用 Windows PowerShell 获取服务信息
如上一部分所述,可以键入简洁的 PowerShell 命令;前面的命令可以缩短为:
PS C:\> gsv w* | sort status
这里使用了 gsv,它是 get-service 的别名;它利用了 -include 开关位于第一个参数位置的事实,使用 sort(sort-object cmdlet 的别名)。 -property 开关位于第一个参数位置。 现在假设你想要停止万维网发布服务。 如果不使用 PowerShell,可以右键单击 W3SVC 服务以获取其上下文菜单,然后单击“停止”项。 使用 Windows PowerShell 可以发出以下命令:
PS C:\> stop-service -servicename w3svc
或者,采用缩短形式:
PS C:\> spsv w3svc
另一个常见任务是查看计算机上正在运行的进程。 此时,你可以预测如何使用 Windows PowerShell 执行此操作,Windows PowerShell 一致且符合逻辑的 cmdlet 命名方案使猜测命令变得容易,而不会让人头疼:
PS C:\> get-process
假设要查看按每个进程拥有的句柄数量排序的正在运行的进程:
PS C:\> get-process | sort-object -property handles
可以使用基于 GUI 的 Windows 任务管理器轻松获取此信息。 但讨论以下三个 Windows PowerShell 命令的作用:
PS C:\> $p = get-process
PS C:\> $result = $p | measure-object -property handles -sum -average -max
PS C:\> $result | out-file '.\ProcessHandleStats.txt'
第一个命令 $p = get-process 获取有关当前在主机上运行的进程的所有信息,并将该信息存储到变量 $p 中。
第二个命令 $result = $p | measure-object -property 句柄 -sum -max,将得到的进程信息发送到 measure-object cmdlet,该 cmdlet 计算当前正在运行的进程使用的所有句柄的总和、平均值和最大值,并将该信息存储到变量 $result 中。 如果此时查看 $result,会看到类似以下内容:
Count : 54
Average : 273.148148148148
Sum : 14750
Maximum : 1625
最低要求:
Property : Handles
请注意,在本例中,共有 54 个进程在运行,共有 14,750 个句柄正在使用,平均每个进程大约有 273 个句柄。 进程使用的最大句柄数是 1625 个句柄。
第三行 $results | out-file '.\ProcessHandleStats.txt' 将结果保存到文本文件中。 经验丰富的 Windows PowerShell 用户可能会将刚刚介绍的三个命令组合成一个命令,例如:
PS C:\> gps | measure-object handles -sum -average -max |
out-file '.\ProcessHandleStats.txt'
Windows PowerShell 体系结构的一个特点是,用户和第三方公司都可以轻松地在各个级别上扩展 Windows PowerShell。 Windows PowerShell 扩展性本身就是一个主题,这里只是举例。
在本文结尾处引用的网络广播演示中,Jeffrey Snover 和 Bill Staples 演示了由一家第三方公司开发的出色的 Windows PowerShell 可视化输出 cmdlet。 此 cmdlet 名为 out-gauge。 请注意与内部输出文件 cmdlet 的语义相似性。 out-gauge 不会像 out-file 那样将输出发送到文件,而是将输出发送到一组视觉效果丰富的控件。 例如,网络广播中演示的其中一个命令是:
PS C:\> get-process |
measure-object handles -sum |
out-gauge -value sum -refresh 0:0:1 -float -type
此命令会生成一个浮动在屏幕上的数字式仪表,实时显示正在使用的句柄总数,并每隔一秒更新一次显示。 所有这些都表明,一系列有用的、基于 Windows PowerShell 的工具即将推出。
接下来,查看使用 Windows PowerShell 部署 IIS 网站的示例。 由于以前版本的 IIS 将配置存储在元数据库中,因此无法将网站从一台计算机复制到另一台计算机。 IIS 使网站部署成为复制文件的简单问题。 讨论以下 Windows PowerShell 脚本:
# file: Deploy-Application.ps1
$sourceMachine = "DemoServer1"
$farmList = get-content '.\RestOfFarm.txt'
$filesToCopy = get-content '.\AppManifest.txt'
foreach ($targetMachine in $farmList)
{
foreach ($file in $filesToCopy)
{
$sourcePath = "\\" + (join-path $sourceMachine $file)
$destPath = "\\" + (join-path $targetMachine $file)
write-host -for yellow "$targetMachine : Copying files from
$sourcePath"
copy-item $sourcePath $destPath
-recurse -force
}
}
此脚本比较复杂,但具有启发性。 保存为 Deploy-Application.ps1 文件并从 Windows PowerShell 命令行执行时,如下所示:
PS C:\> .\Deploy-Application.ps1
实际效果是将位于计算机 DemoServer1 上的 AppManifest.txt 文件中列出的所有文件复制到 RestOfFarm.txt 文件中列出的所有计算机。 Windows PowerShell 的一个特点是,相对于 VBScript 或 Perl 等替代工具,编写良好的脚本很容易理解。 该脚本使用 get-content cmdlet 从 RestOfFarm.txt 文件读取计算机名称,并从 AppManifest.txt 文件读取文件名。
你可能不太熟悉 foreach 循环。 外循环遍历存储在变量 $farmList 中的每个计算机名称,并将每个名称分别存储到变量 $targetMachine 中。 内循环类似,将每个文件存储到 $file 中。 join-path cmdlet 用于智能连接字符串,以生成完整的源路径和目标路径。
最后,copy-item cmdlet 执行复制操作,其中 -recurse 开关复制所有子目录,而 -force 开关使现有文件被覆盖。 请注意,此脚本包含有关源位置和目标位置的所有信息,并将其硬编码到其中。 Windows PowerShell 具有优秀的参数传递功能,因此可以将此示例脚本参数化以接受命令行中的信息,但是,该主题不在本文的范围内。
IIS 的 Windows PowerShell
到目前为止,本文介绍了适用于任何服务器计算机的 Windows PowerShell 示例。 现在,我们来看看一些特定于 IIS 的 Windows PowerShell cmdlet。
IIS 添加了缓存动态创建内容的强大功能。 IIS 很早就具备缓存静态页的功能。 当服务器收到对最近请求的内容的新客户端请求时,会发生以下情况:不会从外部存储中检索该内容,而是立即从高速缓存中提取所请求的内容并将其返回给客户端。 结果是性能显著提高。 IIS 通过启用缓存动态创建的页面来扩展此想法。 讨论此预发行版 IIS Windows PowerShell cmdlet:
PS C:\> add-iiscaching
-computer $computerlist
-path Demo
-location index.php
-credential $cred
-extension .php
-kernelcachepolicy 0
-itemlocation 0
-policy 1
-varybyquerystring "Qwd,Qif,Qiv,Qis"
编写自定义 cmdlet 主题不在本文范围内,但本例的目的是让你了解可以编写的 cmdlet 类型以及 IIS 社区将编写的 cmdlet 类型。 cmdlet 名称为 add-iiscaching。 如前所述,Windows PowerShell 具有可扩展的体系结构,允许 IIS 开发团队创建直接与 IIS 配合使用的自定义 cmdlet。 此命令的实际效果是针对名称存储在变量 $computerlist 中的所有 IIS 服务器上的特定 PHP 应用程序,启用查询字符串中带有 Qwd、Qif、Qiv 和 Qis 的页面请求的动态缓存。
虽然要点应该很清楚,你可以使用简单的 Windows PowerShell 命令轻松地实现 IIS 的强大性能改进,但本文继续详细介绍此示例中的开关参数。
第一个参数 -computer $computerlist 指定要在哪些计算机上执行 add-iiscaching 命令。 例如,如果你有一个名为“MyServers.txt”的简单文本文件,其计算机名称如下:
demo1server
demo2server
demo3server
demo4server
则命令
PS C:\> $computerlist = get-content '.\MyServers.txt'
将服务器列表读入变量 $computerlist。
第二个参数 -path Demo 指向要启用缓存的应用程序的根路径。 在本例中,由于路径值没有空格,因此可以省略引号字符,尽管它们之前像这样使用:-path "Demo"。
第三个参数 -location index.php 指向目标应用程序。 第四个参数 -credential $cred 将身份验证信息保存在变量 $cred 中。这对于将文件复制到远程计算机来说是必要的。 此信息也可以通过内部 get-credential cmdlet 捕获,例如:
PS C:\> $cred = get-credential
此命令将启动一个 GUI 控件,用户可以在其中指定用户名和密码,结果将存储到 $cred 变量中。
第五个参数 -extension .php 指定要缓存的应用程序的类型。
第六个参数 -kernelcachepolicy 0 指示 add-iiscaching cmdlet 不缓存内核信息。
第七个参数 -itemlocation 0 指定缓存响应信息的位置;0 表示存储在客户端或服务器上。
第八个参数 -policy 1 表示继续缓存,直到基础缓存元素发生更改(而不是缓存指定的时间间隔)。
最后一个参数 -varybyquerystring "Qwd,Qif,Qiv,Qis" 告知 IIS 要缓存的响应类型,在本例中为对查询字符串中包含 Qwd、Qif、Qiv 和 Qis 的请求的响应。 (这些是本示例中 PHP 应用程序使用的名称/值对的特定名称部分。)
总结
本文首先简要介绍了 Windows PowerShell、Microsoft 的新 shell 环境和脚本语言。 提供了一些典型的 Windows PowerShell 文件导航和操作示例,并表示 Windows PowerShell 远远领先于现有 shell 环境。
本文的第二部分演示了如何在运行 IIS 的典型环境中使用 Windows PowerShell。 这些示例包括查看主机上的 Windows 服务和进程。 还保证了使用 Windows PowerShell 管理 IIS 和与 IIS 交互的一些优势,并提供了列表。
以下是早期 Windows PowerShell 用户对这些优势的六条评论。 其中还包括 IIS 团队体验过的优势。
- 由于 Windows PowerShell 命令可以存储为脚本,因此可以在无人参与的情况下保存和执行它们。 任何基于脚本的技术都具有这一优势,但 Windows PowerShell 比其他现有脚本语言更容易使用。
- 由于 Windows PowerShell 命令可以作为脚本存储和使用,因此它们会创建 IIS 管理活动的自编记录。 你多久尝试一次记住如何使用 regedit.exe GUI 修改一些注册表项?
- 与使用基于 GUI 的管理界面相比,Windows PowerShell 命令“揭开了迷雾”,让你确切地了解正在发生的情况。 基于 GUI 的工具非常适合轻松的管理活动。 但是,使用基于 GUI 的工具可能会导致这样的想法:“我不清楚为什么这样做会有效,但我双击它通常可以解决问题”。
- 由于许多其他 Microsoft 服务器产品将基于 Windows PowerShell,因此每次使用 Windows PowerShell 命令和脚本来管理 IIS 时,你都会间接获得有关其他系统的培训。
- 使用 Windows PowerShell 可创建常见的管理范例和通信方式:Windows PowerShell 社区正在迅速发展,理解以 Windows PowerShell 命令形式出现的文档或博客条目要比理解诸如“打开 MMC 然后单击这里,然后单击那里,然后双击那里...”之类的文档容易得多 。 。
- 由于 Windows PowerShell 是一个综合环境,因此你可以在 Windows PowerShell 中执行大部分工作。 你无需不断地从基于 GUI 的程序跳转到 cmd.exe shell,再跳转到另一个基于 GUI 的程序。 这类似于软件开发活动从使用单独的编译器、链接器、调试器等发展到使用 Visual Studio 等集成环境的方式。
本文的第二部分还介绍了一个 Windows PowerShell 脚本示例,该示例展示了 IIS 使用简单的文件复制操作跨多台计算机部署 Web 服务器的功能。
本文的第三部分介绍了 Windows PowerShell 设计如何允许 IIS 社区创建和共享直接与本机 IIS 功能一起操作的自定义 Windows PowerShell cmdlet。 特别是提供了 add-iiscaching,这是一个预发布的 cmdlet,可以启用 IIS 缓存动态创建的页面的功能。
虽然本文只是触及了 Windows PowerShell 和 IIS 如何协同工作的浅显内容,但应该已经使你相信,二者的组合提供了更简单、更有效和更愉快的 IT 管理体验。
Windows PowerShell 和 IIS 资源
请搜索 Channel 9 has joined Microsoft Learn,查看由 Windows PowerShell 架构师 Jeffrey Snover 和 IIS 产品部门经理 Bill Staples 主持的网络广播,这是本文的基础。
请参阅此处详细了解基于 Windows PowerShell 的可视化工具。
有关 Microsoft IIS 的信息,请参阅 www.iis.net。
关于作者
James McCaffrey 博士就职于 Volt Information Sciences, Inc.,负责为 Microsoft 华盛顿州雷德蒙德园区的软件工程师提供技术培训。 他曾担任 Microsoft 几个重要产品的首席工程师,包括 Internet Explorer 和 MSN Search,并著有《.NET Test Automation: A Problem-Solution Approach》(Apress,2006 年)。