借助 PowerShell 创建动态Web内容


PowerShell服务器包含一种类似ASP 基于PowerShell的模板语言,用于构建 Web 应用程序,使 PowerShell 脚本可被web访问。这种 PowerShell ASP 模板语言可以包含标记和内联混合的powershell脚本。您可将PowerShell ASP这种模板语言应用于现有应用程序,或者仅基于 PowerShell Web 页面创建完整的应用程序。PowerShell Server 自带的轻量级的 WebServer 允许用户从web访问PowerShell 脚本而不需要额外地安装 Microsoft IIS。

PowerShell Web Publishing可在ASP.NET平台运行,通过自定义的IHttpHandler映射到*.ps1x文件。因此,PowerShell Web Publishing页面可与任何ASP.NET应用程序交互。这样可充分利用 PowerShell Web Server运行现有的应用系统,也可仅基于 *.ps1x 页面创建完整的应用系统。

借助 PowerShell 创建 Web 内容

借助PowerShell的Web服务只需简单几个步骤即可实现常规ASP.NET应用程序的操作:

  1. 添加 PowerShell Web 程序集的引用:nsoftware.PowerShellASP.dll。
  2. 在 Web.config 文件添加条目,映射 *.ps1x 扩展文件到 PowerShell Web发布的程序集,例如:
  3. 若没有按照如上步骤操作,可配置*.ps1x扩展文件映射到IIS应用程序的ASP.NET ISAPI扩展库。

完成这些简单的步骤之后,即可在Web应用程序创建PowerShell Web Publishing页面。

发布PowerShell Web页面

PowerShell Web 页面是扩展名为 *.pslx 的文本文件,包括相互作用的常规 PowerShell 代码标记片段。不同于 ASP.NET ,在 PS1X 页面没有“代码分离”模型,这样更类似于ASP经典模式。

如下是一个简单的PS1X页面:

正如你看到的所有页面都是HTML标记语言组成以“<%”结束,表示“运行 PowerShell 语句并输出结果”,在上面的例子中,会调用内置的 ASP.NET Request 对象查询其中的“name”的值并输出。

你还可创建完整的代码块,包含任何形式的 PowerShell 表达和控制流结构,甚至是混合使用的标记代码。例如,下面是一个简单的页面,显示目前运行的计算机进程列表:

动态RSS和Atom Feeds

PowerShell Web 发布允许借助 PowerShell 脚本在 ASP.NET Web Server上生成 RSS 和 Atom feeds。Feed 可基于执行 PowerShell pipeline 中的 PowerShell RSS 特殊脚本的返回对象自动生成。

借助PowerShell Web发布创建Feed

启用PowerShell RSS脚本,如下简单步骤即可实现:

  1. 创建新的ASP.NET 网页/应用程序。
  2. 添加 nsoftware.PowerShellRSS.dll的引用,或者将其复制到你站点的 ./bin 文件夹。
  3. 在网站Web.Config文件注册PowerShell RSS ASP.NET Http Handler。
  4. 若没有按照如上步骤操作,可配置*.ps1x扩展文件映射到IIS应用程序的ASP.NET ISAPI扩展库。

创建PowerShell RSS 脚本

PowerShell RSS 是一种以 .rslx 扩展名保存的标准 PowerShell 脚本。当 PowerShell Web 服务执行脚本时,pipeline 返回对象基于如下规则自动转化为 RSS/Atom Feed 条目:

  • 通过 pipeline 返回的每个对象都是一个 RSS 条目。
  • 如果对象只是一个常规的原始值,比如字符串或数字,其值可作为 RSS 条目的标题。
  • 如果对象是一个数组,数组中的每一项都可被编写为 RSS 条目的元素。
  • 如果对象是一个哈希表,那么它的每个key/value都可被编写为 RSS 条目的元素,使用key作为元素名称。

例如,如下脚本生成3个RSS条目:

自定义RSS生成

如果想要更好控制对象转换成 RSS 条目的过程,可以通过返回一个哈希表来实现。哈希表可准确控制 RSS Feed 条目的元素名称,并且允许通过添加前缀“rss:”或“atom:”覆盖基本 RSS 条目属性值。

如下是从C盘文件列表生成一个消息源,自定义条目转化过程:

自定义的Feed属性

默认情况下,PowerShell Web 发布会提供一些关于生成脚本元数据的基本信息。例如feed标题将会是你 *.rslx 脚本文件名称。

然而,你也可以通过调用Set-FeedAttr函数自定义这些属性值,唯一需要的参数是属性名称和属性值。

生成Atom Feeds

PowerShell Web 服务将默认生成 RSS feeds,然而,如果你在feed URL PowerShellRSS的查询字符串中添加“?@atom” ,将会生成Atom格式的Feed。

内置对象

除了运行标准PowerShell代码外,你或许想通过调用如 HttpRequest 和 HttpResponse 的 ASP.NET 内置对象改变 HTTP runtime设置,因为 PowerShell 中使用线程模型,那些对象都不能通过 HttpContext.Runtime 直接访问。

  1. $Request: 包含 HttpRequest 对象。
  2. $Server: 包含 HttpUtility 对象。
  3. $Session: 包含HttpSession对象。
  4. $Application: 包含HttpApplication对象。
  5. $Response: 包含HttpResponse对象. 你可根据自己的意愿直接将代码写在响应流中,也可使用write-host和friends实现。
  6. $Cache: 包含HttpCache对象。
  7. $Context: HttpContext 对象与当前请求相关联。

这些对象工作原理与常规的 ASP.NET 应用程序一样,如下代码可实现将 HttpRequest 对象的所有值转存到 一个简单的HTML 页面:

正如我们所看到的,这个示例并没有使用模板功能,而是使用简单的 PowerShell 表达式生成并输出的。

使用PowerShell ASP

PowerShell ASP 结合了 PowerShell 功能和 .NET 结构,以及传统 ASP 的易操作性,PowerShell ASP 脚本也可理解为 PowerShell 脚本和 HTML语言的结合。

创建你自己的 PowerShell ASP 页面

访问 http://localhost/PowerShellASP/ 可看到我们为您创建的演示页面和RSS Feeds,任何的 .ps1x 扩展名文件都将执行 PowerShell ASP 脚本。

借助 HTML 自定义你的 PowerShell ASP 页面

结合 HTML 和 PowerShell 脚本优化你的网页。例如,你需要描述一个HTML表中从 get-childitem 返回的对象。

处理用户输入

通过包含在 PowerShell ASP中 已创建的 $request 对象,访问 HTTP 上下文信息,包括查询字符串或表单输入。

创建RSS and Atom Feeds

正如 .ps1X 文件生成 HTML 输出,.rs1x 和 .as1x 文件可生成 RSS 和 Atom 输出。