Get-ChildItem -Exclude参数如何工作?

Sim*_*wsi 6 powershell

Get-ChildItem -Exclude参数如何工作?它遵循什么规则?

Get-ChildItem的Get-Help根本没有详细说明:

省略指定的项目.此参数的值限定Path参数.输入路径元素或模式,例如"*.txt".允许使用通配符.

在Stackoverflow和其他地方,普遍的共识似乎是它太难以使用,我们应该只将Get-ChildItem的输出传递给Where-Object.

虽然我愿意使用Where-Object,但我对规则很好奇 - 排除如下.

例如,我有一个包含以下子文件夹的文件夹:

HsacFixtures
HsacFixturesBuild
RestFixture
RestFixtureBuild
Run Code Online (Sandbox Code Playgroud)

如果我执行以下命令:

Get-ChildItem $rootFolderPath -Exclude HsacFixturesBuild -Directory
Run Code Online (Sandbox Code Playgroud)

它返回预期的结果:

HsacFixtures
RestFixture
RestFixtureBuild
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加一个-Recurse参数:

Get-ChildItem $rootFolderPath -Exclude HsacFixturesBuild -Directory -Recurse
Run Code Online (Sandbox Code Playgroud)

然后它返回HsacFixturesBuild文件夹中的子文件夹.

我也试过HsacFixturesBuild\HsacFixturesBuild\*,它们具有相同的结果.

那么--Exclude只适用于直接的孩子,而不适用于大孩子或更深的子文件夹?

Nko*_*osi 8

Exclude基于Name省略子对象,

对于文件,获取文件的名称.对于目录,如果存在层次结构,则获取层次结构中最后一个目录的名称.否则,Name属性将获取目录的名称

不是FullName,

它获取目录或文件的完整路径

因此,即使对象是递归调用中的孙子,但排除仅查看对象Name,而不是FullName排除不会影响省略,除非子对象共享恰好是排除参数一部分的名称的公共子字符串

Get-ChildItem

示例3:使用包含和排除获取所有子项

此命令列出Logs子目录中的.txt文件,但名称以字母A开头的文件除外.它使用通配符(*)来指示Logs子目录的内容,而不是目录容器.由于该命令不包含Recurse参数,因此该命令不会自动包含目录内容; 你需要指定它.

Windows PowerShell

PS C:\> Get-ChildItem –Path "C:\Windows\Logs\*" -Include "*.txt" -Exclude "A*"
Run Code Online (Sandbox Code Playgroud)