首页 > 代码库 > Powershell对象选择,排序和变量存储

Powershell对象选择,排序和变量存储

PowerShell基础教程(17)——对象的选择、排序和变量存储      

可以使用 Select-Object cmdlet 来创建新的、自定义的 Windows PowerShell 对象,后者包含的属性是从用于创建他们的对象中选择的。键入以下命令可创建新对象,该对象仅包含 Win32_LogicalDisk WMI 类的 Name 和FreeSpace 属性:

PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace

 

Name                                    FreeSpace

----                                    ---------

C:                                      50664845312

 

在发出该命令后,您将无法查看数据的类型,但如果在执行 Select-Object 命令后通过管道将结果传递给 Get-Member,则可发现,对象的新类型 PSCustomObject 已存在:

PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace| Get-Member

 

 

TypeName:System.Management.Automation.PSCustomObject

 

Name        MemberType   Definition

----        ----------   ----------

Equals      Method       System.Boolean Equals(Object obj)

GetHashCode Method       System.Int32 GetHashCode()

GetType     Method       System.Type GetType()

ToString    Method       System.String ToString()

FreeSpace   NoteProperty  FreeSpace=...

Name        NoteProperty System.String Name=C:

 

Select-Object 有很多用途。其中之一就是复制可随后进行修改的数据。现在,我们可以解决上一节中遇到的问题了。我们可以更新最新创建的对象中的 FreeSpace 的值,而且输出将包括描述性标签:

Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0; $_}

Name                                                                  FreeSpace

----                                                                  ---------

C:48317.7265625

 

对对象进行排序            

通过使用 Sort-Object cmdlet 可以组织显示的数据,从而可更轻易地对这些数据进行扫描。Sort-Object 可获取排序所依据的一个或多个属性的名称,并返回按这些属性值排序的数据。

以 Win32_SystemDriver 实例列表的问题为例。若要按 State 排序,然后按 Name 排序,则可通过键入以下命令来实现:

Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap

 

尽管这会生成很长的数据显示,但还是可看出具有相同状态的项组合在一起:

Name           State   Started DisplayName

----           -----   ------- -----------

ACPI           Running    True Microsoft ACPI Driver

AFD            Running    True AFD

AmdK7          Running    True AMD K7 Processor Driver

AsyncMac       Running    True RAS Asynchronous Media Driver

...

Abiosdsk       Stopped   False Abiosdsk

ACPIEC         Stopped   False ACPIEC

aec            Stopped   False Microsoft Kernel Acoustic Echo Canceller

...

 

还可通过指定 Descending 参数以倒序顺序排序对象。这将颠倒排序的顺序,因此将按倒序的字母顺序排序名称,按降序的顺序排序数字。

PS> Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name -Descending | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap

 

Name           State   Started DisplayName

----           -----   ------- -----------

WS2IFSL        Stopped   False Windows Socket 2.0 Non-IFS Service Provider Support Environment

 

wceusbsh       Stopped   False Windows CE USB Serial Host Driver...

...

wdmaud         Running    True Microsoft WINMM WDM Audio Compatibility Driver

Wanarp         Running    True Remote Access IP ARP Driver

...

 

使用变量存储对象            

Windows PowerShell 可以使用对象。利用 Windows PowerShell,您可创建变量(本质上命名为对象)以保留输出以备后用。如果您已习惯于在其他外壳程序中处理变量,请谨记,Windows PowerShell 变量是对象,而非文本。

变量始终可通过首字符 $ 指定,并且在变量名称中可以包含所有的字母数字字符或下划线。

创建变量

通过键入有效的变量名称可以创建变量:

PS> $loc

PS>

 

由于 $loc 没有值,因此将不会返回任何结果。您可以创建变量,并可同时向其赋值。Windows PowerShell 只能创建目前尚不存在的变量,否则,它会将指定的值赋予已存在的变量。若要在变量 $loc 中存储当前位置,请键入:

$loc = Get-Location

 

由于输出已发送到 $loc,因此在键入此命令后将不会显示任何输出。在 Windows PowerShell 中,显示的输出实际上是附加功能,因为未定向的数据始终会发送到屏幕上。键入 $loc 将显示当前位置:

PS> $loc

 

Path

----

C:/temp

 

您可以使用 Get-Member 来显示有关变量内容的信息。通过管道将 $loc 传递给 Get-Member 表示,$loc 为 PathInfo对象,这类似于 Get-Location 的输出:

PS> $loc | Get-Member -MemberType Property

 

 

TypeName:System.Management.Automation.PathInfo

 

Name         MemberType Definition

----         ---------- ----------

Drive        Property   System.Management.Automation.PSDriveInfo Drive {get;}

Path         Property   System.String Path {get;}

Provider     Property   System.Management.Automation.ProviderInfo Provider {...

ProviderPath Property   System.String ProviderPath {get;}

 

对变量进行操作

Windows PowerShell 提供了几条用于对变量进行操作的命令。通过键入以下命令可以查看极具可读性的完整列表:

Get-Command -Noun Variable | Format-Table -Property Name,Definition -AutoSize -Wrap

 

除了当前 Windows PowerShell 会话中创建的变量之外,还存在几个系统定义的变量。您可以使用 Remove-Variablecmdlet 来清除所有不受 Windows PowerShell 控制的变量。键入以下命令可清除所有变量:

Remove-Variable -Name * -Force -ErrorAction SilentlyContinue

 

这将生成确认提示,如下所示:

确认

是否确实要执行此操作?

对目标“Name: Error”执行操作“Remove Variable”。[Y] 是  [A] 全是  [N] 否  [L] 全否  [S] 挂起  [?] 帮助(默认值为“Y”):A

 

随后,如果运行 Get-Variable cmdlet,则可查看剩余的 Windows PowerShell 变量。由于还存在 Windows PowerShell 变量驱动器,因此也可通过键入以下命令来显示所有的 Windows PowerShell 变量:

Get-ChildItem variable:

 

使用 Cmd.exe 变量

尽管 Windows PowerShell 不是 Cmd.exe,但它也运行于命令外壳程序环境中,并且可以在 Windows 的任意环境中使用相同的可用变量。这些变量是通过名为 env: 的驱动器公开的。键入以下命令可查看这些变量:

Get-ChildItem env:

 

尽管未设计标准变量 cmdlet 来处理 env: 变量,但仍可通过指定 使用这些变量。例如,若要查看操作系统根目录,则可键入以下命令,使用 Windows PowerShell 中的命令外壳程序 %SystemRoot% 变量:

PS> $env:SystemRoot

C:/WINDOWS

 

也可创建和修改 Windows PowerShell 中的环境变量。从 Windows PowerShell 访问的环境变量符合 Windows 之外的环境变量标准规则。

 

 

说明:此文引用csdn博客erway的PowerShell基础教程(17)——对象的选择、排序和变量存储    一文