作者 :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命令 shell 和.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 (更改目录) 命令的功能等效项。 你可能会注意到,每次更改当前目录时,必须键入“set-location”,因为键入过多;这是正确的。

    Windows PowerShell有一组可以使用的快捷方式别名。 set-location cmdlet 的别名为 sl (完整 cmdlet 名称) 的缩短版本,) 以“old”方式 (cd。 本文使用 cmdlet 名称的完整版本以提高可读性。

    第二个命令是:

    PS C:\Data> get-childitem Pow*
    

    这会列出当前目录中以“Pow”开头的内容。 Windows PowerShell不区分大小写,因此可以键入 Get-ChildItem 或 GET-ChildItem。 本文使用所有小写字母。 get-childitem cmdlet 别名为 dir (for Windows familiarity) 和 ls (for Unix users) ,并别名为 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 大致等效于 windows) 或 cat (Unix) 命令 (类型。 使用 sl 别名将工作目录更改为根驱动器来完成微型演示:

    PS C:\Data> sl \
    

    现在,如果所有需要Windows PowerShell都使用一组新的命令执行常见的文件系统导航和操作任务,那么进一步阅读就没有意义了。 简短的、一段的介绍可能会导致这种不正确的假设。 但是,Windows PowerShell比当前许多 shell 环境具有许多优势。

    结束本介绍性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 的六大优势。

    下面是一些基于 Web 强制转换的Windows PowerShell示例,这些示例以Windows PowerShell架构师 Jeffrey Snover 和 IIS 产品单元经理 Bill Staples 为特色

    假设你想要检查计算机上运行的 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,则会看到如下所示的内容:

    计数:54
    平均 : 273.148148148148
    总和: 14750
    最大值:1625
    属性:句柄

    请注意,在此示例中,总共有 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扩展性本身是一个主题,此处只是一个示例。

    在本文末尾引用的 Web 强制转换演示中,Jeffrey Snover 和 Bill Staples 演示了由第三方公司开发的Windows PowerShell可视化输出 cmdlet。 此 cmdlet 名为 out-gauge。 请注意与内部输出文件 cmdlet 的语义相似性。 out-gauge 不会像 out-file 那样将输出发送到文件,而是将输出发送到一组视觉上丰富的控件。 例如,Web 强制转换中演示的命令之一是:

    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。 此命令的净效果是为查询字符串中具有 Qwd、Qif、Qiv 和 Qis 的页面请求启用动态缓存,以针对所有 IIS 服务器上的特定 PHP 应用程序(其名称存储在变量$computerlist中)。

    尽管要点应该很清楚(IIS 可以使用简单的 Windows PowerShell 命令轻松实现强大的性能改进)但本文继续介绍此示例中开关参数的详细信息。

    第一个参数 -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 交互的一些优势。

    以下是早期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 资源

    Search Channel 9 已加入 Microsoft Learn for the Web 演员Windows PowerShell架构师 Jeffrey Snover 和 IIS 产品单元经理 Bill Staples,后者作为本文的基础。

    请参阅此处,详细了解基于Windows PowerShell的可视化工具。

    有关 Microsoft IIS 的信息,请参阅 www.iis.net

    James McCaffrey博士在Volt信息科学公司工作,在那里他管理在华盛顿雷德蒙德微软校区工作的软件工程师的技术培训。 他曾在包括 Internet Explorer 和 MSN Search 在内的多个关键 Microsoft 产品上担任首席工程师,并且是 2006 年 Apress 的“.NET 测试自动化:Problem-Solution方法”的作者。