可以使用 Select-Object cmdlet 来创建新的、自定义的 Windows PowerShell 对象,后者包含的属性是从用于创建他们的对象中选择的。键入以下命令可创建新对象,该对象仅包含 Win32_LogicalDisk WMI 类的 Name 和 FreeSpace 属性:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace<o:p></o:p> <o:p> </o:p> Name FreeSpace<o:p></o:p> ---- ---------<o:p></o:p> C: 50664845312<o:p></o:p> |
<o:p> </o:p>
在发出该命令后,您将无法查看数据的类型,但如果在执行 Select-Object 命令后通过管道将结果传递给 Get-Member,则可发现,对象的新类型 PSCustomObject 已存在:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace| Get-Member<o:p></o:p> <o:p> </o:p> <o:p> </o:p> TypeName:System.Management.Automation.PSCustomObject<o:p></o:p> <o:p> </o:p> Name MemberType Definition<o:p></o:p> ---- ---------- ----------<o:p></o:p> Equals Method System.Boolean Equals(Object obj)<o:p></o:p> GetHashCode Method System.Int32 GetHashCode()<o:p></o:p> GetType Method System.Type GetType()<o:p></o:p> ToString Method System.String ToString()<o:p></o:p> FreeSpace NoteProperty FreeSpace=...<o:p></o:p> Name NoteProperty System.String Name=C:<o:p></o:p> |
<o:p> </o:p>
Select-Object 有很多用途。其中之一就是复制可随后进行修改的数据。现在,我们可以解决上一节中遇到的问题了。我们可以更新最新创建的对象中的 FreeSpace 的值,而且输出将包括描述性标签:
Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0; $_}<o:p></o:p> Name FreeSpace<o:p></o:p> ---- ---------<o:p></o:p> C:48317.7265625<o:p></o:p> |
<o:p> </o:p>
通过使用 Sort-Object cmdlet 可以组织显示的数据,从而可更轻易地对这些数据进行扫描。Sort-Object 可获取排序所依据的一个或多个属性的名称,并返回按这些属性值排序的数据。
以 Win32_SystemDriver 实例列表的问题为例。若要按 State 排序,然后按 Name 排序,则可通过键入以下命令来实现:
Get-WmiObject -Class Win32_SystemDriver | Sort-Object -<st1:place w:st="on"><st1:placename w:st="on">Property</st1:placename> <st1:placetype w:st="on">State</st1:placetype></st1:place>,Name | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap<o:p></o:p> |
<o:p> </o:p>
尽管这会生成很长的数据显示,但还是可看出具有相同状态的项组合在一起:
Name State Started DisplayName<o:p></o:p> ---- ----- ------- -----------<o:p></o:p> ACPI Running True Microsoft ACPI Driver<o:p></o:p> AFD Running True AFD<o:p></o:p> AmdK7 Running True AMD K7 Processor Driver<o:p></o:p> AsyncMac Running True RAS Asynchronous Media Driver<o:p></o:p> ...<o:p></o:p> Abiosdsk Stopped False Abiosdsk<o:p></o:p> ACPIEC Stopped False ACPIEC<o:p></o:p> aec Stopped False Microsoft Kernel Acoustic Echo Canceller<o:p></o:p> ...<o:p></o:p> |
<o:p> </o:p>
还可通过指定 Descending 参数以倒序顺序排序对象。这将颠倒排序的顺序,因此将按倒序的字母顺序排序名称,按降序的顺序排序数字。
PS> Get-WmiObject -Class Win32_SystemDriver | Sort-Object -<st1:place w:st="on"><st1:placename w:st="on">Property</st1:placename> <st1:placetype w:st="on">State</st1:placetype></st1:place>,Name -Descending | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap<o:p></o:p> <o:p> </o:p> Name State Started DisplayName<o:p></o:p> ---- ----- ------- -----------<o:p></o:p> WS2IFSL Stopped False Windows Socket 2.0 Non-IFS Service Provider Support Environment<o:p></o:p> <o:p> </o:p> wceusbsh Stopped False Windows CE USB Serial Host Driver...<o:p></o:p> ...<o:p></o:p> wdmaud Running True Microsoft WINMM WDM Audio Compatibility Driver<o:p></o:p> Wanarp Running True Remote Access IP ARP Driver<o:p></o:p> ...<o:p></o:p> |
<o:p> </o:p>
Windows PowerShell 可以使用对象。利用 Windows PowerShell,您可创建变量(本质上命名为对象)以保留输出以备后用。如果您已习惯于在其他外壳程序中处理变量,请谨记,Windows PowerShell 变量是对象,而非文本。
变量始终可通过首字符 $ 指定,并且在变量名称中可以包含所有的字母数字字符或下划线。
通过键入有效的变量名称可以创建变量:
PS> $loc<o:p></o:p> PS><o:p></o:p> |
<o:p> </o:p>
由于 $loc 没有值,因此将不会返回任何结果。您可以创建变量,并可同时向其赋值。Windows PowerShell 只能创建目前尚不存在的变量,否则,它会将指定的值赋予已存在的变量。若要在变量 $loc 中存储当前位置,请键入:
$loc = Get-Location<o:p></o:p> |
<o:p> </o:p>
由于输出已发送到 $loc,因此在键入此命令后将不会显示任何输出。在 Windows PowerShell 中,显示的输出实际上是附加功能,因为未定向的数据始终会发送到屏幕上。键入 $loc 将显示当前位置:
PS> $loc<o:p></o:p> <o:p> </o:p> Path<o:p></o:p> ----<o:p></o:p> C:\temp<o:p></o:p> |
<o:p> </o:p>
您可以使用 Get-Member 来显示有关变量内容的信息。通过管道将 $loc 传递给 Get-Member 表示,$loc 为 PathInfo 对象,这类似于 Get-Location 的输出:
PS> $loc | Get-Member -MemberType Property<o:p></o:p> <o:p> </o:p> <o:p> </o:p> TypeName:System.Management.Automation.PathInfo<o:p></o:p> <o:p> </o:p> Name MemberType Definition<o:p></o:p> ---- ---------- ----------<o:p></o:p> Drive <st1:street w:st="on"><st1:address w:st="on">Property System.Management.Automation.PSDriveInfo Drive</st1:address></st1:street> {get;}<o:p></o:p> Path Property System.String Path {get;}<o:p></o:p> Provider Property System.Management.Automation.ProviderInfo Provider {...<o:p></o:p> ProviderPath Property System.String ProviderPath {get;}<o:p></o:p> |
<o:p> </o:p>
Windows PowerShell 提供了几条用于对变量进行操作的命令。通过键入以下命令可以查看极具可读性的完整列表:
Get-Command -Noun Variable | Format-Table -Property Name,Definition -AutoSize -Wrap<o:p></o:p> |
<o:p> </o:p>
除了当前 Windows PowerShell 会话中创建的变量之外,还存在几个系统定义的变量。您可以使用 Remove-Variable cmdlet 来清除所有不受 Windows PowerShell 控制的变量。键入以下命令可清除所有变量:
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue<o:p></o:p> |
<o:p> </o:p>
这将生成确认提示,如下所示:
确认<o:p></o:p> 是否确实要执行此操作?<o:p></o:p> 对目标“Name: Error”执行操作“Remove Variable”。[Y] 是 [A] 全是 [N] 否 [L] 全否 [S] 挂起 [?] 帮助(默认值为“Y”):A<o:p></o:p> |
<o:p> </o:p>
随后,如果运行 Get-Variable cmdlet,则可查看剩余的 Windows PowerShell 变量。由于还存在 Windows PowerShell 变量驱动器,因此也可通过键入以下命令来显示所有的 Windows PowerShell 变量:
Get-ChildItem variable:<o:p></o:p> |
<o:p> </o:p>
尽管 Windows PowerShell 不是 Cmd.exe,但它也运行于命令外壳程序环境中,并且可以在 Windows 的任意环境中使用相同的可用变量。这些变量是通过名为 env: 的驱动器公开的。键入以下命令可查看这些变量:
Get-ChildItem env:<o:p></o:p> |
<o:p> </o:p>
尽管未设计标准变量 cmdlet 来处理 env: 变量,但仍可通过指定 前缀来使用这些变量。例如,若要查看操作系统根目录,则可键入以下命令,使用 Windows PowerShell 中的命令外壳程序 %SystemRoot% 变量:
PS> $env:SystemRoot<o:p></o:p> C:\WINDOWS<o:p></o:p> |
<o:p> </o:p>
也可创建和修改 Windows PowerShell 中的环境变量。从 Windows PowerShell 访问的环境变量符合 Windows 之外的环境变量标准规则。