Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

使用 PowerShell Copy-Item Cmdlet 复制文件

使用 PowerShell Copy-Item Cmdlet 复制文件

Jun 23, 2025

PowerShell Copy-Item Cmdlet 是什么?

Powershell 中的 Copy-Item cmdlet 主要用于将文件从源位置复制到目标位置。就文件数量而言,可以是单个文件,也可以是一组文件,并包含其内容。它还可以跨不同文件系统运行,例如本地、网络共享等。

基本语法和参数

PowerShell Copy-Item cmdlet 的基本语法如下:

      Copy-Item -Path <source> -Destination <destination> [<parameters>]
      

如果只输入 cmdlet,PowerShell 将如下面所示提示你输入“Source”:

Image

适合初学者的 Windows PowerShell 脚本教程(PDF)

了解更多

第一个必需参数是源路径。该“项路径”参数用于指定要复制的项或项集合的路径。源可以是文件路径或文件夹路径。可以使用逗号分隔的列表指定多个路径,并且路径可以包含通配符。最佳实践是提供目标路径字符串,以指定应将这些项复制到的路径。如果复制单个项,则在需要时,路径可以包含复制后项的新名称。

下面是 Copy-Item PowerShell cmdlet 的其他参数列表:

  • -Recurse: 以递归方式复制子目录及其内容。也就是说,Copy-Item cmdlet 会应用到顶层文件夹以及其下所有层级的子文件夹。
  • -Force parameter: 会覆盖现有的只读文件;如果目标目录不存在,则会创建目标目录。
  • -Container: 在复制操作期间保留容器对象。当需要复制目录结构时,这非常有用。
  • -Filter: 指定用于限定 path 参数的筛选字符串,例如指定特定的文件扩展名
  • -Include: 指定要复制的项目,并支持通配符。仅复制同时匹配 Path 和 Include 参数的项目
  • -Exclude: 指定要从复制中排除的项目,并支持通配符
  • -Credential: 指定要用于该操作的用户帐户凭据
  • -WhatIf: 显示在不实际执行命令的情况下运行命令时会发生什么
  • -Confirm: 在执行命令之前提示进行确认
  • -FromSession: 指定用于获取远程文件的 PSSession 对象。
  • -ToSession: 指定要将远程文件发送到的 PSSession 对象

精心挑选的相关内容:

常见用例

在大多数示例中,我们会将文件复制到本地计算机的多个位置。不过,Copy-Item cmdlet 也有多种常见用例,包括:

  • 创建重要文件和文件夹的备份
  • 将文件或简单应用分发到多台计算机
  • 在服务器或存储位置之间迁移大量文件
  • 开发者可以在开发的不同阶段创建项目文件夹的快照。
  • 将配置文件分发到多台服务器

现在让我们把 Copy-Item cmdlet 与其他文件管理 cmdlet 进行比较:

Copy-Item vs. Move-Item:

  • Copy-Item 会创建一个副本,同时保留原始内容不变
  • Move-Item 会移动文件/文件夹,并将其从原始位置移除

Copy-Item vs. Get-ChildItem

  • Copy-Item 执行复制操作
  • Get-ChildItem 用于列出文件和文件夹,通常与 Copy-Item 一起使用

请注意,Copy-Item cmdlet 适用于基本的文件复制。若需要用于大文件传输或镜像的更高级功能,可以考虑使用 Microsoft Robocopy。

使用 Copy-Item PowerShell Cmdlet 复制文件

基本的文件复制示例

在这个示例中,我们希望使用 PowerShell 的 copy item 命令,将电子表格从一个文件夹复制到另一个文件夹。

      Copy-Item -Path "C:\Destination One\SpreadsheetOne.xlsx" -Destination "c:\Destination Two"

      

在 PowerShell 中看起来是这样的:

Image

复制多个文件

接下来,我们一次复制一个以上的文件。请注意,文件路径使用的是不同的驱动器。还要记住:如果目标目录不存在,PowerShell 会创建它。

      Copy-Item -Path "C:\source\file1.txt","C:\Source\file2.txt" -Destination "D:\Destination Two"
      

使用重命名复制文件

您可以使用下面的命令将文件复制到新的文件夹,并在此过程中对其进行重命名:

      Copy-Item -Path "C:\Source\file1.txt" -Destination "C:\Destination Two\NewName1.txt"
      

下面是在 PowerShell 中的显示效果:

Image

使用 PowerShell 复制文件夹

PowerShell 的复制功能不仅限于文件——您还可以使用 Copy-Item cmdlet 将文件夹复制到新的位置。下面,我们将演示如何使用 PowerShell 复制文件夹及其内容的命令。

基本的文件夹复制示例

使用下面的 PowerShell 复制文件夹命令,将文件夹复制到其他位置。此 PowerShell 复制命令将复制“source”文件夹中的所有文件,并将它们放到目标文件夹中。

      Copy-Item -Path "C:\source\folder" -Destination "D:\destination"
      

包含子文件夹的文件夹复制

如果源文件夹中包含多个子目录怎么办?使用上面的基本命令,子文件夹中的任何内容都会被忽略。如果你想复制源文件夹中的所有内容(包括子目录的内容),则需要使用 Recurse 参数执行 PowerShell 复制文件夹和子文件夹命令。

      Copy-Item -Path "C:\source\folder" -Destination "D:\destination" -Recurse
      

复制并合并多个文件夹

假设你想复制两个源文件夹中的文件,并将它们合并到一个目标文件夹中。使用 PowerShell 的“copy contents of folder to another folder”命令就能轻松实现。在这里,两个源路径用逗号分隔。它们会先被复制,然后合并到目标文件夹中。

      Copy-Item -Path "C:\source1\*","C:\source2\*" -Destination "D:\destination"
      

高级文件和文件夹复制技术

在文件路径中使用通配符

通配符允许你在不逐个列出每个项目的情况下,复制与特定模式匹配的多个文件或文件夹。它们非常适合处理大量文件或文件夹的情况,因为使用通配符可以显著减少你需要编写的代码量。在下面的示例中,通配符用于匹配任何 .txt 文件:

      Copy-Item -Path "C:\source\*.txt" -Destination "C:\Destination Two"
      

下面是在 PowerShell 中的样子:

Image

使用“包含(Include)”和“排除(Exclude)”参数筛选文件

有时你会希望在复制时,从文件夹中排除某些特定文件。你可能想要排除或仅包含某些文件类型或文件版本,或者不包含包含敏感信息的特定文件。因此,在备份或迁移过程中,你很可能需要排除临时文件或不必要的文件。

在下面的示例中,我们会复制并指定所有日志文件都应被视为复制对象;但是,任何同时具有 .tmp 扩展名的日志文件都将被排除。

      Copy-Item -Path "C:\source\*" -Destination "D:\destination" -Include "*.log" -Exclude "*.tmp"
      

使用 Force 参数覆盖文件

默认情况下,Copy-Item 会在不提示的情况下覆盖目标位置的现有文件。有时,你可能会遇到这样的情况:目标文件夹中包含一个与要复制的文件同名的只读文件。默认情况下,Copy-Item 不会覆盖这个只读文件。不过,你可以使用 -Force 参数覆盖这种行为并强制进行覆盖。下面是一个使用示例:

      Copy-Item -Path "C:\source\file.txt" -Destination "D:\destination" -Force
      

通过 Copy-Item 将文件和文件夹复制到远程计算机

尽管在本地计算机上可能需要将文件和文件夹复制到不同的驱动器位置,但 Copy-Item cmdlet 的真正优势在于,它能够促进远程计算机之间的文件和文件夹传输。

使用 New-PSSession 配置远程会话

假设你想使用 PowerShell 将一些文件复制到远程计算机。尽管你可能拥有本地管理员权限,但你当前的帐户可能没有访问目标计算机所需的适当权限。你还需要知道远程机器的计算机名(computername)。在这种情况下,你必须使用替代凭据与新计算机建立远程会话。你可以使用下面的 $session 命令来执行 PowerShell,将文件复制到文件夹。

      $session = New-PSSession -ComputerName "RemotePC" -Credential "User"
      

将文件复制到远程计算机

现在,您可以使用已建立的会话将文件复制到远程计算机。

      Copy-Item -Path "C:\source\file.txt" -Destination "C:\remote\destination" -ToSession $session
      

从远程计算机复制文件

当然,您可能需要将文件从远程计算机复制到本地计算机。要做到这一点,请使用以下命令。

      Copy-Item -Path "C:\remote\source\file.txt" -Destination "C:\local\destination" -FromSession $session
      

递归复制远程文件夹

在前面的示例中,涉及远程计算机时,并未将子文件夹及其内容包含在复制操作中。要包含源项目路径的全部内容(包括所有子文件夹和文件),请像在本地复制操作中一样,在 Copy-Item 命令中添加 -Recurse 参数。

      Copy-Item -Path "C:\remote\source\folder" -Destination "C:\local\destination" -FromSession $session -Recurse
      

精选相关内容:

错误处理与验证

使用 WhatIf 和 Confirm 参数

WhatIf 参数可让你在不进行任何更改的情况下验证命令的执行结果。例如,如下所示,你可能会希望在执行复制操作之前先确认源路径和目标路径是否正确。

Image

你还可以检查覆盖(overwrite)行为,它会显示哪些文件会在目标位置被覆盖,从而帮助你避免意外的数据丢失。WhatIf 能帮助你准确了解将复制哪些项目。下面显示的是命令参数。

      Copy-Item -Path "C:\Source\File1.txt" -Destination "C:\Destination Two" -WhatIf
      

默认情况下,大多数 PowerShell cmdlet 会在未经用户确认的情况下对系统进行更改。可能存在一些场景,你希望在执行某个操作时由用户进行确认。最好的例子是使用 PowerShell 删除文件。在下面的示例中,你使用 confirm 命令提示用户进行确认。

      Remove-Item -Path C:\file.txt -Confirm
      

如下面所示,该命令将在 PowerShell 中执行:

Image

你可以为任何 Copy-Item 命令添加 -Confirm 参数。

验证复制过程

使用 PowerShell 备份关键文件时,你可能会想要确认复制过程是否已经发生。你可以创建一个简单的 PowerShell 脚本(例如下面的脚本),通过比较文件数量、大小和时间戳来验证是否完成了文件复制。

      # Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Copy the files from source to destination
Copy-Item -Path $source\* -Destination $destination -Recurse
# Confirm the files were copied by checking if they exist in the destination folder
$sourceFiles = Get-ChildItem -Path $source
$allCopied = $true
foreach ($file in $sourceFiles) {
    $destinationFile = Join-Path $destination $file.Name
    if (Test-Path $destinationFile) {
        Write-Host "File '$($file.Name)' was copied successfully."
    } else {
        Write-Host "File '$($file.Name)' failed to copy."
        $allCopied = $false
    }
}
if ($allCopied) {
    Write-Host "All files copied successfully."
} else {
    Write-Host "Some files failed to copy."
}
      

错误处理与重试

在进行大文件复制时,你可能需要使用错误处理机制,以确保脚本能够正常运行,并能从意外故障中恢复。在 PowerShell 中,处理错误的主要方式是通过 try-catch 块。下面的脚本使用 try-catch 来处理复制文件时的错误。

      # Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Function to copy files with error handling
function Copy-Files {
    try {
        # Copy files and set error action to stop failure
        Copy-Item -Path $source\* -Destination $destination -Recurse -ErrorAction Stop
        Write-Host "Files copied successfully."
    }
    catch {
        # Log the error message
        Write-Error "An error occurred while copying files: $($_.Exception.Message)"
        # Perform additional actions, like retrying or logging
    }
    finally {
        Write-Host "Copy operation complete."
    }
}
# Execute the function
Copy-Files

      

Copy-Item cmdlet 的实用示例与使用场景

常见任务的详细示例

  • 从故障迹象的硬盘复制文件: 硬盘出现故障迹象,需要在硬盘彻底失效之前将关键文件复制到安全位置。
  • 针对每日文件变更的备份自动化: 为灾难恢复,公司可能需要将关键目录中的所有文件备份到备份服务器。
  • 从本地(On-Prem)服务器迁移到云存储: 公司可能希望将本地服务器的文档从本地磁盘迁移到 Azure 或 AWS 等云存储提供商。
  • 向多台服务器部署配置文件: 系统管理员希望从 C:\ConfigUpdates 将更新后的配置文件部署到一组远程服务器。

真实场景与解决方案

复杂的文件结构在使用 Copy-Item cmdlet 时可能会带来一些棘手的情况。例如,较长的文件路径可能会在不支持超过 260 个字符的文件路径的旧版 Windows 上出现问题。在这种情况下,你可能希望使用 UNC 路径而不是本地文件路径。

在使用 Copy-Item cmdlet 时,可能需要用到 -LiteralPath 参数。当路径包含特殊字符(例如 [, ] 或 *)时,如果不加处理,PowerShell 可能会将其解释为通配符字符或转义序列,此时就可能需要使用该参数。

权限问题也是常见的困扰。你可以使用 -Force 参数来覆盖某些限制,或者以管理员身份运行 PowerShell。

精选相关内容:

用于自动化的示例脚本

尽可能多地将手动任务自动化,可以简化流程并避免人为错误。下面是一个用于将文件夹备份到备份目录的 PowerShell 脚本示例。

      # Define source and destination directories
$sourcePath = "C:\SourceDirectory"
$backupPath = "D:\BackupDirectory"
# Get current timestamp to append to the backup folder
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
# Create a new folder for the current backup with timestamp
$backupDestination = "$backupPath\Backup_$timestamp"
New-Item -ItemType Directory -Path $backupDestination
# Copy all files and directories from the source to the backup folder
try {
    Copy-Item -Path $sourcePath -Destination $backupDestination -Recurse -Force
    Write-Output "Backup completed successfully on $(Get-Date)"
} catch {
    Write-Output "An error occurred during the backup: $_"
}
# Optional: Clean up old backups (e.g., delete backups older than 30 days)
$daysToKeep = 30
$oldBackups = Get-ChildItem -Path $backupPath -Directory | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$daysToKeep) }
foreach ($backup in $oldBackups) {
    try {
        Remove-Item -Path $backup.FullName -Recurse -Force
        Write-Output "Old backup removed: $($backup.FullName)"
    } catch {
        Write-Output "An error occurred while deleting old backups: $_"
    }
}
      

提示与最佳实践

使用 Copy-Item 的最佳实践

虽然 Copy-Item cmdlet 很简单,但在更复杂的情况下,以下是一些可能对你有所帮助的最佳实践。

  • 以管理员身份运行 PowerShell
  • 使用 -Recurse 参数来复制整个目录结构。
  • 请谨慎使用 -Force 参数,以避免意外覆盖
  • 复制大型目录时,请考虑 Robocopy 等替代方案,或选择更适合大型任务的其他工具。
  • 可以考虑使用 -WhatIf 来测试命令:在不进行实际更改的情况下查看可能会发生什么。

常见陷阱及如何避免

除了最佳实践之外,在使用 PowerShell 脚本时你还应牢记这些常见陷阱:

  • 使用完整路径,以避免使用无法按预期解析的错误路径或相对路径
  • 很容易忘记底层的子目录,因此请使用 -Recurse 参数,以确保复制父目录中包含的所有文件。
  • 权限不足会阻止你完成复制操作,尤其是在涉及远程计算机时。请确保具有正确的权限,并在必要时使用更高权限。
  • 当复杂的复制操作无法正确完成时,请使用 try-catch 块,并实现适当的错误记录(error logging)。

性能注意事项与优化

复制大量数据集可能会在你的计算机上消耗大量处理能力。并行处理(Parallel processing)是一种计算技术,其做法是将任务拆分为更小的部分,并在多个处理器或内核上同时执行。当应用于诸如 Copy-Item cmdlet 所执行的文件操作时,并行处理可以显著提升性能。并行处理允许多个文件同时被复制,从而利用现代多核处理器的全部能力,而不是像传统方式那样一次只复制一个文件并按顺序进行。由于该方法能够更高效地利用可用的系统资源,它可以大幅减少大型复制操作所需的时间。尽管 Copy-Item cmdlet 并不原生支持并行处理,但 PowerShell 提供了诸如 ForEach-Object -Parallel 之类的机制,可以与 Copy-Item 配合使用来实现并行文件复制。这在涉及大量文件或复杂目录层级的场景中,可能会带来显著的性能收益。下面展示一个基本示例:

      <$sourcePath = "C:\SourceFolder"
$destPath = "D:\DestinationFolder"
Get-ChildItem $sourcePath | ForEach-Object -Parallel {
    Copy-Item $_.FullName -Destination $using:destPath -Force
} -ThrottleLimit 8
      

结论

Copy-Item cmdlet 命令是 PowerShell 中用于管理文件和目录操作的多功能工具。它提供了多种参数,可覆盖多种场景,例如能够指定要复制的项目路径并实现错误处理。无论你是在使用 PowerShell 脚本将文件从源复制到目标,还是需要在本地或跨远程系统复制文件,Copy-Item cmdlet 都能高效地执行必要的复制功能。可以考虑引入并行处理,以提升大规模且复杂数据集的性能,或者探索为处理大范围数据传输而设计的专用工具。熟练掌握 Copy-Item cmdlet 能确保文件传输的准确性,使其成为任何 PowerShell 用户工具箱中的必备组件;同时理解其局限性则有助于在何时采用替代方法时做出更明智的决策。

分享到

了解更多

关于作者

Asset Not Found

Kevin Horvatin

首席软件架构师

Kevin Horvatin 是 Netwrix 的首席软件架构师,负责 Netwrix Privilege Secure。作为一名拥有 20 多年经验的软件开发人员,自 PowerShell 和 C# 推出以来,他一直与它们合作开发。