在Windows操作系统中,命令行界面(CLI)一直是其相对UNIX系统较弱的一环。UNIX系统拥有强大的shell如sh、bash、ksh等,而Windows直到较晚才引入了PowerShell,这是一个基于.NET的强大shell。PowerShell不仅包含了UNIX shell的所有功能,如命令组合和管道传输,还引入了一些独特的特性,使其在系统管理员的自动化任务中显得尤为强大。
PowerShell 的一些关键特性包括:
要开始使用 PowerShell,首先需要安装.NET2.0 运行时环境:
然后下载并安装 PowerShell:
接下来,为了更好地学习和编写脚本,推荐使用一个IDE:
在开始之前,需要启用脚本执行:
PS > Set-ExecutionPolicy Unrestricted
这将允许运行来自外部源的脚本。
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(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 对象:
$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)
所有别名、函数和变量仅添加到当前会话。为了保留更改,需要将它们添加到配置文件中。以下是配置文件的位置列表:
也可以创建、共享和分发配置文件。
PowerShell 允许使用通用方法在文件系统、注册表和计算机上的证书之间进行导航。要查看可用的导航区域,请使用:
get-psdrive
文件系统:
与正常操作相同。
注册表:
cd HKLM
ls
cd system\currentcontrolset\control
快速资源的好地方:
PowerShell 附带了大量的文档。查看用户指南,它是IT管理员的重要参考。
Scott Hanselman 制作了一些关于PowerShell的优秀播客。如果还没有听过hanselminutes,应该去看看:
官方页面上有很多信息: