HOWTO · PowerShell

在 PowerShell 中复制项目时排除文件夹

本教程演示如何在 PowerShell 中复制文件项,排除文件夹。

在文件管理和使用 PowerShell 自动化的领域,复制文件时排除特定文件夹是一项常见但复杂的挑战。本文探讨了实现此任务的两种有效方法:使用带 -Exclude 参数的 Get-Item 函数和利用 Where-Object 结合 PSIsContainer 属性。

这两种方法在服务于相同目的的同时,从不同角度解决问题,并提供独特优势。

我们的目标是提供对这些方法、应用及其使用细微差别的全面理解。通过详细的解释、语法分析和实际例子,我们旨在为新手和经验丰富的 PowerShell 用户提供技能,以高效管理文件复制任务,定制其方法以符合工作流程的具体要求。

使用 Get-Item 函数和 -Exclude 参数在 PowerShell 复制操作中排除文件夹

我们可以使用 Copy-Item 命令在 PowerShell 中复制文件,同时排除一个文件夹。使用 Copy-Item 时排除文件夹有两种方法,一种是排除单个文件夹,另一种是排除多个文件夹。

此操作的语法将 Copy-ItemGet-Item -Exclude 结合起来:

Copy-Item -Path (Get-Item -Path "sourcePath\*" -Exclude ('folderToExclude')).FullName -Destination "destinationPath" -Recurse -Force

参数:

  • Copy-Item:此 cmdlet 将文件和目录复制到新位置。
  • -Path:指定要复制的项的路径。在我们的例子中,这由 Get-Item 提供。
  • Get-Item:从指定位置检索项。
  • -Exclude:此参数在 Get-Item 中过滤出项,特别是排除的文件夹或文件的名称。
  • ('folderToExclude'):要排除的文件夹名称。
  • .FullName:检索项的完整路径。
  • -Destination:复制项的目标路径。
  • -Recurse:包括子目录的内容。
  • -Force:强制命令运行而不询问用户确认。

代码示例:

Copy-Item -Path (Get-Item -Path "origin\*" -Exclude ('SubFolder')).FullName -Destination "destination\" -Recurse -Force

在我们的脚本中,我们首先定位源目录(C:\origin\),并使用 Get-Item 检索其包含的所有项。此处使用的星号(*)符号充当通配符,代表目录中的每个项。

然后,我们利用 -Exclude 参数明确表示我们要排除特定子文件夹,特别是名为 SubFolder 的文件夹。在这种情况下,使用 .FullName 属性至关重要,因为它获取我们处理的每个项的完整路径。

在整理出这一明显排除指定文件夹的列表后,将其交给 Copy-Item。我们继续将目标位置定义为目标目录(C:\destination)。为了确保全面的复制过程,包括所有子目录,除了我们选择排除的那个,我们添加了 -Recurse 参数。

为了进一步顺利我们的过程并避免潜在的中断,-Force 参数发挥了作用。它有效地抑制了可能会暂停操作的任何系统提示,特别是与覆盖目标目录中现有文件相关的提示。

origin 文件夹:

powershell 复制项排除文件夹 - 源文件

输出:

powershell copy-item 排除文件夹 - 输出

以上命令将仅排除一个指定的文件夹。我们也可以通过在 -Exclude() 中放入多个文件夹名称来排除多个文件夹。

查看排除多个文件夹的命令:

Copy-Item -Path (Get-Item -Path "origin\*" -Exclude ('SubFolder', 'SubFolder2')).FullName -Destination "destination\" -Recurse -Force

查看输出:

powershell copy-item 排除文件夹 - 输出

使用 Where-ObjectPSIsContainer 在 PowerShell 复制操作中排除文件夹

PowerShell 提供了一套广泛的 cmdlet 供文件和文件夹操作,Copy-Item 是复制操作的关键工具。然而,它的原生功能不直接支持排除文件夹。

为了实现这一点,我们结合使用 Get-ChildItemWhere-ObjectPSIsContainer 属性。此方法在需要排除目录的复制操作中尤其有用,同时保留文件。

脚本的结构如下:

Get-ChildItem -Path "sourcePath\" -Recurse | Where-Object { $_.PSIsContainer -notmatch 'True' } | Copy-Item -Destination "destinationPath" -Recurse -Container

参数:

  • Get-ChildItem -Path "sourcePath\" -Recurse:从指定路径检索所有项(文件和文件夹),包括子目录。
  • Where-Object { $_.PSIsContainer -notmatch 'True' }:过滤掉所有目录。PSIsContainer 是一个布尔属性,对目录为 True,对文件为 False
  • Copy-Item -Destination "destinationPath" -Recurse -Container:将剩余的项(文件)复制到目的地。-Recurse 用于确保子目录遍历,-Container 保留目录结构。

代码示例:

Get-ChildItem -Path "origin\" -Recurse | Where-Object { $_.PSIsContainer -notmatch 'True' } | Copy-Item -Destination "destination\" -Recurse -Container

在我们的脚本中,我们首先从源目录(origin\)收集所有项。为此,我们使用 Get-ChildItem cmdlet。

真正的魔力出现在 Where-Object cmdlet 中,我们引入一个过滤器专门排除目录。该排除基于 $_ .PSIsContainer -notmatch 'True' 条件。

此代码片段至关重要,因为它有效地筛选收集的项,确保仅将文件(而非目录)传递给后续管道。

接下来,这些过滤后的文件将交给 Copy-Item cmdlet。我们的命令是将这些文件复制到指定的目标(destination\)。

这一操作的重要方面是如何在排除文件夹本身的情况下,在目标中保留原始目录结构。通过在 Copy-Item 中仔细安排 -Recurse-Container 参数,确保保持文件结构的完整性,减少实际文件夹的数量。

输出:

powershell 复制-项排除文件夹 - 输出

结论

总之,本文中介绍的技术 — 使用 Get-Item 结合 -ExcludeWhere-Object 结合 PSIsContainer — 提供了在 PowerShell 复制操作中排除文件夹的强大而灵活的方法。通过理解和应用这些方法,用户可以显著增强其在 PowerShell 中的文件管理和自动化能力。

Get-Item-Exclude 方法对于排除特定文件夹简单且高效,而 Where-ObjectPSIsContainer 方法则提供了更细致的控制,尤其适用于排除标准更复杂或动态的场景。两种方法均展示了 PowerShell 在处理文件和目录方面的多功能性和强大性,使其成为系统管理员、开发人员和 IT 专业人士不可或缺的工具。

拥有这些知识,用户可以自信地处理各种文件复制任务,确保在 Windows 环境中高效而精确地控制文件管理操作。