Windows PowerShell 深入指南

在Windows操作系统中,命令行界面(CLI)一直是其相对UNIX系统较弱的一环。UNIX系统拥有强大的shell如sh、bash、ksh等,而Windows直到较晚才引入了PowerShell,这是一个基于.NET的强大shell。PowerShell不仅包含了UNIX shell的所有功能,如命令组合和管道传输,还引入了一些独特的特性,使其在系统管理员的自动化任务中显得尤为强大。

PowerShell 的特性

PowerShell 的一些关键特性包括:

  • 面向对象:PowerShell 是完全面向对象的,这是其强大之处之一。例如,在bash中,可以将进程列表以文本形式传递给另一个应用,而在PowerShell中,得到的是进程对象列表,这些对象拥有属性和方法。
  • 访问.NET2.0 程序集:PowerShell 允许访问完整的.NET2.0 程序集。
  • 可扩展性:可以创建自己的cmdlet程序集,使得其他人可以通过脚本控制应用程序。
  • 托管能力:可以在.NET应用程序中托管PowerShell,仅需不到10行代码。
  • 使用Windows COM对象:PowerShell 支持使用Windows COM对象。
  • 强大的XML支持:PowerShell 提供了对XML的强大支持。

开始使用 PowerShell

要开始使用 PowerShell,首先需要安装.NET2.0 运行时环境:

然后下载并安装 PowerShell:

接下来,为了更好地学习和编写脚本,推荐使用一个IDE:

在开始之前,需要启用脚本执行:

PS > Set-ExecutionPolicy Unrestricted

这将允许运行来自外部源的脚本。

学习 PowerShell

PowerShell 由许多cmdlet组成,这些cmdlet实际上是由PowerShell解释的DLL。未来,可以学习如何创建自己的cmdlet,以便其他人可以通过脚本控制应用程序。现在,让先来尝试一些内置的cmdlet:

例如:

PS > get-service | get-member

这里,get-service cmdlet 将服务对象列表传递给另一个cmdlet。get-member 则列出了 "System.ServiceProcess.ServiceController" 类的所有可用成员。

格式化输出

PowerShell 提供了多种格式化输出的方法:

PS > get-service schedule | format-list -property *

这里,get-service 获取名为 'schedule' 的服务对象,并将其传递给另一个cmdlet以格式化输出属性。

也可以使用:

PS > get-service | Format-List PS > get-service | Format-Custom PS > get-service | Format-Table PS > get-service | Format-Wide PS > get-service | format-table name, Servicetype, Canshutdown

获取帮助

PowerShell 提供了大量的文档。Get-Help 命令类似于UNIX中的man命令。

例如:

PS > Get-help get-command -detailed PS > Get-help get-command -full PS > Get-help get-command -examples PS > Get-help get-command -parameter *

常用命令

以下是一些常用的PowerShell命令:

PS > Get-Command - 获取关于cmdlet和其他Windows PowerShell命令的基本信息。 PS > Get-Process - 获取本地计算机上正在运行的进程。 PS > Get-Service - 获取本地计算机上的服务。 PS > Get-Eventlog - 获取有关本地事件日志或存储在其中条目的信息。 PS > Start-transcript, stop-transcript - 允许记录会话/与PS的交互。

别名

别名实际上是命令的别名。例如:'ps' 是 get-process 的别名。

PS > get-alias ps PS > get-alias | where-object {$_.definition -eq "set-location"} PS > set-alias gh get-help PS > set-alias np c:\windows\notepad.exe PS > remove-item alias:ls

变量、循环和字符串操作

作为脚本语言,PowerShell 支持变量、循环和字符串操作。

$result = ipconfig

使用 for 循环打印行号:

for ($i=0 ; $i -lt $result.length; $i++ ) { "{0} {1}" -f $i, $result[$i] }

使用 foreach:

$i = 1; foreach($singleLine in $result) { $i++; "{0} {1}" -f $i, $singleLine }

使用内置字符串函数:

PS > "How dooz is this".split()

函数

可以像在任何脚本语言中一样创建函数。可以传递参数并返回值。

$result = ipconfig function AddLineNumbers { $i = 1; foreach ($singleLine in $args[0]) { $i++; "{0} {1}" -f $i, $singleLine } } AddLineNumbers $result

WMI脚本

WMI(Windows Management Instrumentation)是Windows管理的重要技术。WMI 允许访问Windows系统的大量信息。Get-WmiObject cmdlet 提供了对WMI对象的访问。

Get-WmiObject win32_bios -computername 127.0.0.1 Get-WmiObject -Class Win32_OperatingSystem -ComputerName 127.0.0.1

.NET 脚本

在脚本中常见的操作之一是发送电子邮件。首先,需要创建一个邮件消息 .NET 对象:

$mailMsg = New-Object -TypeName System.Net.Mail.MailMessage("sender@net.com.au","recipient@net.com.au")

然后设置一些选项和邮件消息:

$mailMsg.IsBodyHtml = $true $mailMsg.Body = "This is a sample mail message sent from PowerShell" $mailMsg.Subject = "This is a sample mail message sent from PowerShell"

创建邮件消息后,需要创建客户端对象并发送电子邮件:

$client = New-Object -TypeName System.Net.Mail.SmtpClient("mail.optusnet.com.au") $client.Send($mailMsg)

Shell 配置文件

所有别名、函数和变量仅添加到当前会话。为了保留更改,需要将它们添加到配置文件中。以下是配置文件的位置列表:

  • %windir%\system32\WindowsPowerShell\v1.0\profile.ps1 - 适用于所有用户和所有shell。
  • %windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1 - 适用于所有用户,但仅适用于Microsoft.PowerShell shell。
  • %UserProfile%\My Documents\WindowsPowerShell\profile.ps1 - 仅适用于当前用户,但影响所有shell。
  • %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 - 仅适用于当前用户和Microsoft.PowerShell shell。

也可以创建、共享和分发配置文件。

导航

PowerShell 允许使用通用方法在文件系统、注册表和计算机上的证书之间进行导航。要查看可用的导航区域,请使用:

get-psdrive

文件系统:

与正常操作相同。

注册表:

cd HKLM ls cd system\currentcontrolset\control

快速资源的好地方:

PowerShell 附带了大量的文档。查看用户指南,它是IT管理员的重要参考。

Scott Hanselman 制作了一些关于PowerShell的优秀播客。如果还没有听过hanselminutes,应该去看看:

官方页面上有很多信息:

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485