Powershell复制到-如果存在目标目录,则复制到现有目录中

时间:2018-12-03 12:06:02

标签: powershell copy-item

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

releasecode.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-源“ C:\ test \ from”-目标“ 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目录结构。

更多信息

  • 在Windows Box上运行此

  • $PSVersionTable

enter image description here

1 个答案:

答案 0 :(得分:1)

您遇到了与复制源目录有关的Copy-Item陷阱。

如果目标存在并且是文件夹,则cmdlet将源复制到目标

Copy-Item 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将源复制为目标

Copy-Item 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中处理此问题的常用方法是确保首先存在目标文件夹,然后然后复制源文件夹的 content

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