Copy-Item 是什么
Copy-Item 复制文件与目录,是 PowerShell 里的通用复制命令:对象语义清晰,可以直接接收管道里筛好的文件对象,也能用强制参数处理只读目标。复制目录时必须加递归参数,否则只会在目标建一个空目录而不报错,这是最容易漏检的问题。它的适用场景是脚本中的中小规模复制;大目录迁移建议换用带日志、重试与多线程能力的专用复制工具,出问题时也更容易定位。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 及以上 |
|---|---|
| 语法 | Copy-Item [-Path] <源> [-Destination] <目标> [-Recurse] [-Force] [-Container] |
| 目录复制 | 必须加递归参数,否则只建空目录 |
| 覆盖行为 | 目标已存在时默认覆盖,只读属性文件需加强制参数 |
| 管道输入 | 可接收文件对象,配合筛选实现精准复制 |
| 不保留项 | 默认不复制访问控制权限,需要保留属性时改用专用工具 |
典型使用场景
- 复制单个文件到备份目录,覆盖前用强制参数处理只读属性
- 按筛选结果复制:先取符合条件的文件对象再交给复制命令
- 复制整个目录树到网络共享或另一块盘
- 部署脚本中分发程序文件到多个目标位置
- 复制时保留目录结构,或只保留内容不留外层目录
- 复制注册表项内容,用于配置迁移
常用示例
常用示例
# 复制文件到已存在目录(文件会放入该目录)
Copy-Item D:\Src\app.exe D:\Bak\ -Force
# 复制整个目录树
Copy-Item D:\Web \\srv\share\web -Recurse -Force
# 只复制目录内容,不要外层目录
Copy-Item D:\Web\* \\srv\share\web -Recurse -Force
# 按筛选结果复制:先取对象再复制
Get-ChildItem D:\Logs -File -Filter *.log | Where-Object LastWriteTime -gt (Get-Date).AddDays(-1) | Copy-Item -Destination D:\Bak
# 复制并保留目录结构到目标
Get-ChildItem D:\Web -Recurse -File | Copy-Item -Destination { 'D:\Bak\' + $_.FullName.Substring(6) } -Force
# 复制前先预演
Copy-Item D:\Web \\srv\share\web -Recurse -WhatIf参数与行为
| 参数 | 作用 | 注意点 |
|---|---|---|
| -Recurse | 递归复制目录内容 | 不加时目录只被复制成空壳 |
| -Force | 覆盖只读文件与隐藏项 | 大范围覆盖前先预演 |
| -Container | 保留容器结构 | 与递归配合控制目录层级 |
| -Destination | 目标路径 | 目标为已存在目录时源放入其内 |
| -WhatIf | 预演将执行的动作 | 批量复制前的安全检查 |
| 管道输入 | 接收文件对象 | 便于先筛选后复制 |
复制目录时忘记递归参数是最隐蔽的错误:命令不报错,目标却只有一层空目录,事后核对时容易误以为已经复制完成。
跨卷或跨网络复制大文件耗时较长,脚本里应设置合理的超时与错误处理;需要日志与重试时换用专用复制工具,效率与可观测性都更好。