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只适用于直接的孩子,而不适用于大孩子或更深的子文件夹?
Exclude基于Name省略子对象,
对于文件,获取文件的名称.对于目录,如果存在层次结构,则获取层次结构中最后一个目录的名称.否则,Name属性将获取目录的名称
不是FullName,
它获取目录或文件的完整路径
因此,即使对象是递归调用中的孙子,但排除仅查看对象Name,而不是FullName排除不会影响省略,除非子对象共享恰好是排除参数一部分的名称的公共子字符串
示例3:使用包含和排除获取所有子项
此命令列出Logs子目录中的.txt文件,但名称以字母A开头的文件除外.它使用通配符(*)来指示Logs子目录的内容,而不是目录容器.由于该命令不包含Recurse参数,因此该命令不会自动包含目录内容; 你需要指定它.
Windows PowerShell
Run Code Online (Sandbox Code Playgroud)PS C:\> Get-ChildItem –Path "C:\Windows\Logs\*" -Include "*.txt" -Exclude "A*"
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3026 次  |  
        
|   最近记录:  |