获取-子项目:使用PowerShell列出文件和文件夹

还记得 DOS 的 dir 命令的美好时光吗?Linux 的 ls 命令呢?如果是这样,那么 Get-childItem 本质上就是那个命令的升级版。

事实上,我们甚至在 PowerShell 中以别名的形式拥有了 dirls。Get-Childitem PowerShell cmdlet 不仅可以通过 PowerShell 控制台或PowerShell 脚本列出文件系统上的文件和文件夹,还可以枚举注册表键和值、各种证书存储中的证书,甚至是 Active Directory 等等。

如果你是初学者/中级 PowerShell 脚本编写者,请务必查看我免费的微课程《构建 PowerShell 工具》!超过 9,000 字的深入解释和见解,教你如何构建 PowerShell 工具。

要理解 Get-Childitem,首先,将其视为 dirls,但它不仅仅是处理文件,而是将许多对象视为子项目并枚举它们。你可以使用别名或完整的命令名称来使用它。

由于这个命令自 PowerShell v1 开始就可用,所以可以确保它与你的PowerShell 版本兼容。

Get-ChildItem 遍历树

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

你可以将此命令指向本地计算机上的本地路径,使用 PowerShell 远程脚本块并在其中使用 Get-ChildItem,或者只是指向 UNC 路径。所有这些都可以。也许我只想列出当前目录中的所有文件。

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

PowerShell 提供程序

微软意识到可以将文件系统的这种“树”状结构应用于其他系统。文件系统的“树”具有文件夹和文件,而注册表具有键和值,而Windows中的证书系统具有存储和存储中的证书。所有这些特定领域都可以被表示为一棵树,因此PowerShell提供程序就诞生了。为什么要谈论PowerShell提供程序呢?因为Get-ChildItem cmdlet是与每个提供程序公开的PowerShell驱动程序交互的*-Item cmdlet的一部分。

Get-ChildItem cmdlet可以在PowerShell驱动器上输出任意数量的对象,并允许您通过管道或在PowerShell foreach 循环中处理每个项目。它了解PowerShell驱动程序的概念,这允许您在一个命令中指定文件系统文件夹、注册表键或证书存储的路径。

您可以看到,此命令可以枚举C:\文件夹、HKEY Current User hive以及PowerShell证书存储。

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

过滤

Get-ChildItem PowerShell 命令不仅可以提取驱动器上的所有对象,还可以通过一些不同的参数过滤信息:FilterIncludeExclude。在可能的情况下,您总是希望使用无处不在的 PowerShell Filter 参数。该参数直接将过滤语法传递给单个提供程序。尽管速度更快,但此语法完全取决于正在查询的提供程序。

例如,当查询文件时,Filter 语法为 Name -eq 'foo' 可能完全没问题,但在查询注册表时根本行不通,因为注册表提供程序甚至没有过滤器!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

然而,当一切都失败时,您还可以使用 IncludeExclude 参数。

此外,PowerShell 中的此命令还具有一些特定于文件系统的参数,如 Force,它将输出隐藏的文件和文件夹,FileDirectory 仅查找文件或文件夹。通过使用 Get-Help 或在Microsoft 文档中查看有关 Get-ChildItem 的完整详细信息。

Get-ChildItem 的另一个很酷的功能是在使用通配符字符时解析路径。在 PowerShell 中,通配符字符通常表示任何内容。例如,如果您想查看具有 .txt 文件扩展名的所有文件,只需指定文件夹的路径和 *.txt

PS> Get-ChildItem -Path 'C:\*.txt'

我们也可以根据文件属性进行过滤。也许我们只想在文件夹中找到只读文件。

PS> Get-ChildItem -Path C:\ -Attributes R -File

摘要

此 PowerShell 命令是您会反复使用的命令之一。大多数情况下,您可能会使用 FileSystem 提供程序,但重要的是要记住,此命令可做的远不止如此。您可以使用它来查询文件、文件夹、注册表键、注册表值、证书、Active Directory 用户、计算机,甚至是环境变量、函数等等!

如果有疑问,请运行 Get-PSDrive 命令,以查看所有加载的 PowerShell 驱动器的列表,Get-ChildItem 可以为您查询。

Source:
https://adamtheautomator.com/get-childitem/