首页 > 解决方案 > Powershell Copy-To - 如果目标目录存在,则复制到现有目录

问题描述

对,我有一个简单的Copy-Item脚本可以将文件从一个目标文件夹复制到另一个。

发布代码.ps1

[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [string]$source, 
    [Parameter(Mandatory=$true)]
    [string]$destination
) 
Process {
    Copy-Item -Path $source -Destination $destination -Recurse -Force

我正在releasecode.ps1使用以下命令行运行:

.\releasecode.ps1 -source "C:\test\from" -destination "C:\test\to"

from文件夹具有以下结构:

.
├── from
├── stain.txt
├── test1.txt
├── folder
|   ├── test2.bmp

这正确复制到(在第一个副本上):

.
├── to
├── stain.txt
├── test1.txt
├── folder
|   ├── test2.bmpthe 

如果我之后直接重新运行它,该from文件夹将创建为“to”内的目录,而不是仅仅覆盖现有结构:

.
├── to
├── stain.txt
├── test1.txt
├── folder
|   ├── test2.bmp
├── from
|   ├── stain.txt
|   ├── test1.txt
|   └── folder
|       ├── test2.bmp

如果文件和文件夹当前存在,我该如何覆盖现有的to目录结构。

更多信息

在此处输入图像描述

标签: powershellcopy-item

解决方案


您遇到了Copy-Item与复制源目录相关的问题。

如果目标存在并且是一个文件夹,则 cmdlet 会将源复制目标。

复制项 C:\src\a C:\dst\b -Recurse

C:\ C:\
├─dst ├─dst
| └─b | └─b
└─src | └─a └─a 
  ⇒ |     ├─bar.txt 
    ├─bar.txt |     └─baz.txt
    └─baz.txt └─src
                      └─a
                        ├─bar.txt
                        └─baz.txt

如果目标不存在,则 cmdlet 将源复制目标。

复制项 C:\src\a C:\dst\b -Recurse

C:\ C:\
├─dst ├─dst
└─src | └─ b 
  └─a |   ├─bar.txt 
    ├─bar.txt ⇒ |   └─baz.txt
    └─baz.txt └─src
                      └─a
                        ├─bar.txt
                        └─baz.txt

在 PowerShell 中处理此问题的习惯方法是先确保目标文件夹存在,然后复制源文件夹的内容

if (-not (Test-Path $destination)) {
    New-Item -Type Directory -Path $destination | Out-Null
}
Copy-Item -Path $source\* -Destination $destination -Recurse -Force

或者,您可以使用robocopy不存在此问题的 :

robocopy C:\src\a C:\dst\b /s

推荐阅读