Windows PowerShell 筛选与格式“两头难”

Don Jones

内容

向左的筛选器在源
权限设置的格式 — — 您正在与之完成
揭秘

在 Windows PowerShell 最有价值专家 (MVP) 邮寄列表,我们 ’ve 最近被讨论 — 并试图文档 — — Windows PowerShell “ 陷阱 ”。您知道我们的意思:don’t 工作的方式完全 ’d 想他们将这些小事情 — — 的真正可能导致问题时您 ’re 学习外壳程序。

最大的陷阱的两个涉及筛选和格式。 我提到过在列表中我试着帮助人员避免这些方面的问题记住筛选左、 右设置格式。发生时向我短语可能更有效地使用 Windows PowerShell 上某一列在好的基础,因此我们如下。

向左的筛选器在源

使用寻找的免费活动目录 (AD) 管理 cmdlet (您可以找到它们 quest.com/powershell) 大量,和鼓励其他人使用,过。 一个 cmdlet,获取-QADUser,旨在从 AD 中检索用户。 查看运行命令类似这样的人不少见的:

Get-QADUser | Where-Object { $_.Department -eq "Sales" } | Set-QADUser -department "Inside Sales"

这将更改每个人的 AD 部门属性设置为销售,使该属性设置为内部销售而。 问题是,筛选发生了。 将第一个 cmdlet 获取-QADUser,检索整个域的每个单个的用户。

幸运的是,它不会检索每个用户的每个属性默认,但在大域,会做多个足够损坏作为较差的域控制器 (DC) struggles 传输到客户端计算机的用户帐户信息。 您的客户端必须检查每个帐户一次然后放弃那些不具有包含值销售部门属性。 什么是浪费!

这就是为什么我要在"左筛选。始终移动筛选条件,到目前为止他命令行的左侧 possible.In 为这种情况下,获取-QADUser cmdlet 本身会支持筛选:

Get-QADUser -Department "Sales" | Set-QADUser -department "Inside Sales"

就不再需要对象位置的 cmdlet。 更好仍,使用下面的语法获取-QADUser 传输筛选器条件,以 DC 和 DC 是检索和仅传输帐户符合此条件。 域控制器都在筛选项 — — 它们执行所有天长真正 — — 这样我们就将放在最佳位置可能为快速执行筛选。 您的客户端不必处理来自 DC,以便更快、 更有效地执行您的命令,将多个对象。

以下是使用 Windows 管理规范 (WMI) 的另一个示例:

Get-WmiObject CIM_DataFile -computerName Server2 | Where { $_.FileName -like "*.dll" }

这将与空格上的 WMI,获取 CIM_DataFile 类的所有实例它表示在硬盘上的文件 — — 并筛选出那些不是 DLL 文件。 因此,则您留下的 DLL 文件,该服务器上的列表。 但这要花的时间来运行 — 您正在把所有服务器的文件信息通过您的计算机。 再次,移动筛选更多的左侧会有助于并且在这种情况下,它是可以执行此操作:

Get-WmiObject CIM_DataFile -computerName Server2 -filter "FileName LIKE '*.dll'"

您需要使用稍有不同的筛选器语法,因为此语法不由 Windows PowerShell 被执行。 而是,它被传输到 WMI 在远程计算机上。 它将仍执行时间,但需要较少的网络通信和最终,较少的开销空格和您的计算机上。 获取习惯于读取 cmdlet 中若要查看一个 cmdlet 提供了哪些筛选选项帮助文件 (帮助获取-WmiObject,在这种情况下)。 只依赖于位置的对象时获取的 * 您正在使用的 cmdlet 不支持所需的筛选。

权限设置的格式 — — 您正在与之完成

与在其他 gotcha 相关格式-* cmdlet,等格式的表格格式的列表。 我看到 newcomers 运行类似于下面这样:

Get-Process | Format-Table ID,VM,Name | Export-CSV c:\processes.csv

它不起作用。 噢,它将运行,但您不喜欢结果。 如果您采用真正阅读该命令将第二个,您可能想知道完全预期仍会发生。 您已获得一组进程,格式它们设置为一个表,然后由于某种原因希望成为.CSV 文件表吗? 如果最终目标是获得一个.CSV 文件仅包含某些对象属性,您将运行此:

Get-Process | Select-Object ID,VM,Name | Export-CSV c:\processes.csv

如果目标是格式化的、 纵栏表进入鏂囨湰鏂囦欢,可以执行此操作:

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

但您不能混合并匹配这两种方法。 了解为什么这样的要求某些背景如何一起这些格式 cmdlet 如何输出的 * cmdlet 工作。

Windows PowerShell 管道) 的是您的命令运行中-是硬编码在结束该 Out-Default cmdlet。 此 cmdlet 会稍有多个重定向到的对象 Out-Host,它负责在屏幕上显示输出。

任何命令行或管道,使用术语正确) 的不最终的输出中 * cmdlet,默认,结束在 Out-Default,它等同于说它以 Out-Host。 这一轮是输出的 * cmdlet 不知道如何操作的对象,它们需要转换为格式说明这些对象。 因此当 Out-Host 获取它将这些对象的格式的一个进程对象 * cmdlet。 它使用哪一个表、 选择,自定义或列表 — — 基于一组我不能在本专栏中介绍的规则。 它将其中一个,和格式的对象,但是 * cmdlet 所需对象,并生成格式的说明。 输出的 * cmdlet 知道如何使用这些格式说明,并它们使用它们创建是必需的任何显示。

因此让我们进入的实际术语:有三个或四个主输出的 * 您将遇到并经常使用的 cmdlet:out-host,out-file,out-printer 和 out-string。

这些被为了使用格式设置指令仅,然后将这些说明带到分别创建一个屏幕显示、 鏂囨湰鏂囦欢、 打印机页或字符串,设计。 要实现这些格式说明在唯一方法是通过格式的运行对象 * cmdlet — 唯一格式的格式设置指令,* cmdlet 生成。 这样,当您运行此:

Get-Process | Format-Table ID,VM,Name |Export-CSV c:\processes.csv

哪些进入.CSV 文件是生成格式表的格式设置指令可能根本不是您期望。 执行格式的后 * cmdlet,您的原始对象丢失,并留下格式说明。 以下是为您的另一个简单规则:格式正确。 换而言极右侧的您的命令行推格式的 cmdlet。 唯一的格式-后 * cmdlet 是回车或一个输出的 * cmdlet。 这就是为什么这是合法的:

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

out-File 知道如何阅读这些格式的说明,并使用它们创建一个文本文件。 这也是合法的:

Get-Process | Format-Table ID,VM,Name 

您在此处,依赖重定向到该硬编码 Out-Default,Out-Host,它知道如何使用格式设置指令,并在主机,或控制台,窗口中创建一个文本显示。 保留格式设置为得尽可能左向右后通过什么或一个输出的 * cmdlet,并且您将很好。

一个更多提示:不应遵循的输出的 * cmdlet 因为只有一个异常,它们的任何发出到管道的对象。 按照一个输出的任何具有的没有意义 * cmdlet,因为没有将会。

揭秘

我希望我已经帮助您了解为什么这些陷阱是方法它们。 但在将很少请记住筛选左,格式正确"并且您应该能够通过完全避免这些陷阱保持的问题。

许多 Windows PowerShell 的一些特点变得更轻松地掌握您真正理解如何以及为什么外壳程序的工作方式后它。 花费时间了解实质上发生的) 和应用的知识,只要您将获得外壳程序中的意外的结果 — 快速地将您在 Windows PowerShell 权威。

Don Jones 是一种 nation 的最有经验的 Windows PowerShell 培训教师和编写器。 在 ConcentratedTech.com 中,他的博客每周 Windows PowerShell 提示您还可能与他联系,或提问他那里。