Windows PowerShell 使用名词 Item 来表示在 Windows PowerShell 驱动器中找到的项。在处理 Windows PowerShell FileSystem 提供程序时,Item 可以是文件、文件夹或 Windows PowerShell 驱动器。在大多数管理设置中,列出并处理这些项是一项重要的基本任务,因此我们应对这些任务进行详细的讨论。
枚举文件、文件夹和注册表项 (Get-ChildItem)
由于从特定位置获取项集合是很常见的任务,因此 Get-ChildItem cmdlet 被设计为专门用于返回在容器(例如文件夹)中找到的所有项。
若要返回文件夹 C:\Windows 中直接包含的所有文件和文件夹,请键入:
PS> Get-ChildItem -Path C:\Windows Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2006-05-16 8:10 AM 0 0.log -a--- 2005-11-29 3:16 PM 97 acc1.txt -a--- 2005-10-23 11:21 PM 3848 actsetup.log ...
在 Cmd.exe 中输入 dir 命令或者在 UNIX 命令 shell 中输入 ls 命令时,所列出的内容与该列表类似。
可以使用 Get-ChildItem cmdlet 的参数来执行非常复杂的列表操作。我们将看到以下几种情况。可以通过键入以下命令来查看 Get-ChildItem cmdlet 的语法:
PS> Get-Command -Name Get-ChildItem -Syntax
可以将这些参数进行混合和匹配以获得较高程度的自定义输出。
列出所有包含的项 (-Recurse)
若要查看 Windows 文件夹内部的项及其子文件夹中包含的所有项,请使用 Get-ChildItem 的 Recurse 参数。列表操作将显示 Windows 文件夹中的所有内容及其子文件夹中的所有项。例如:
PS> Get-ChildItem -Path C:\WINDOWS -Recurse Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\AppPatch Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 1852416 AcGenral.dll ...
按名称筛选项 (-Name)
若要仅显示项名称,请使用 Get-Childitem 的 Name 参数:
PS> Get-ChildItem -Path C:\WINDOWS -Name addins AppPatch assembly ...
强制列出隐藏项 (-Force)
通常,在 Windows 资源管理器或 Cmd.exe 中不可见的项均不会显示在 Get-ChildItem 命令的输出中。若要显示隐藏项,请使用 Get-ChildItem 的 Force 参数。例如:
Get-ChildItem -Path C:\Windows -Force
由于可强制改写 Get-ChildItem 命令的正常行为,因此此参数命名为 Force。Force 参数使用广泛,它可强制执行 cmdlet 非正常执行的操作,但该参数不执行危及系统安全的任何操作。
将项名称与通配符匹配
The Get-ChildItem 命令接受要列出的项的路径中的通配符。
由于通配符匹配是通过 Windows PowerShell 引擎处理的,因此接受通配符的所有 cmdlet 都可使用相同的表示法,并具有相同的匹配行为。Windows PowerShell 通配符表示法包括:
-
星号 (*) 与零或更多出现的字符匹配。
-
问号 (?)仅与一个字符匹配。
-
左方括号 ([) 字符和右方括号 (]) 字符可括住一组要进行匹配的字符。
此处为如何应用通配符规范的一些示例。
若要查找 Windows 目录中具有 .log 后缀且基名称只有五个字符的所有文件,请输入以下命令:
PS> Get-ChildItem -Path C:\Windows\?????.log Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows Mode LastWriteTime Length Name ---- ------------- ------ ---- ... -a--- 2006-05-11 6:31 PM 204276 ocgen.log -a--- 2006-05-11 6:31 PM 22365 ocmsn.log ... -a--- 2005-11-11 4:55 AM 64 setup.log -a--- 2005-12-15 2:24 PM 17719 VxSDM.log ...
若要查找 Windows 目录中以字母 x 开头的所有文件,请键入:
Get-ChildItem -Path C:\Windows\x*
若要查找文件名以 x 或 z 开头的所有文件,请键入:
Get-ChildItem -Path C:\Windows\[xz]*
排除项 (-Exclude)
通过使用 Get-ChildItem 的 Exclude 参数可以排除特定的项。即,在单语句中执行复杂的筛选操作。
例如,假设您要在 System32 文件夹中查找 Windows 时间服务 DLL,但您只记得 DLL 名称是以“W”开头并且其中有数字“32”。
类似于 w*32*.dll 的表达式可找到符合该条件的所有 DLL,但该表达式还会返回名称中包含“95”或“16”的与 Windows 95 和 16 位 Windows 兼容的 DLL。您可以使用模式为 *[9516]* 的 Exclude 参数忽略名称中具有其中任一数字的文件:
PS> Get-ChildItem -Path C:\WINDOWS\System32\w*32*.dll -Exclude *[9516]*
Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\System32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 174592 w32time.dll
-a--- 2004-08-04 8:00 AM 22016 w32topl.dll
-a--- 2004-08-04 8:00 AM 101888 win32spl.dll
-a--- 2004-08-04 8:00 AM 172032 wldap32.dll
-a--- 2004-08-04 8:00 AM 264192 wow32.dll
-a--- 2004-08-04 8:00 AM 82944 ws2_32.dll
-a--- 2004-08-04 8:00 AM 42496 wsnmp32.dll
-a--- 2004-08-04 8:00 AM 22528 wsock32.dll
-a--- 2004-08-04 8:00 AM 18432 wtsapi32.dll
混合使用 Get-ChildItem 参数
可以在同一命令中使用 Get-ChildItem cmdlet 的多个参数。在混合使用参数之前,请确保您了解通配符匹配。例如,以下命令将不会返回任何结果:
PS> Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll
即使 Windows 文件夹中包含两个以字母“z”开头 DLL,也不会返回任何结果。
不返回任何结果是由于我们将通配符指定为该路径的一部分。即使该命令是递归的,但 Get-ChildItem cmdlet 仍将这些项限制为 Windows 文件夹中名称以“.dll”结尾的项。
若要为名称与特定模式相匹配的文件指定递归搜索,请使用 -Include 参数。
PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32\Setup Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 8261 zoneoc.dll Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 337920 zipfldr.dll