Powershell Copy-To - если каталог назначения существует, копирует в существующий каталог

Да, у меня есть простой 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" -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 структура каталогов, если файлы и папки существуют в настоящее время.

Дополнительная информация

  • Запуск этого на Windows Box

  • $PSVersionTable:

1 ответ

Решение

Вы столкнулись с Copy-Item Гоча связана с копированием исходных каталогов.

Если место назначения существует и является папкой, командлет копирует источник в место назначения.

Копировать элемент C:\src\a C:\dst\b -Recurse

C:\                 C:\
D─dst ├─dst
| B─b | └─b
S─src | A─ а
  └─a ⇒ | ├─bar.txt
    Bar─bar.txt | └─baz.txt
    └─baz.txt └─src
                      └─a
                        ├─bar.txt
                        └─baz.txt

Если место назначения не существует, командлет копирует источник в качестве места назначения.

Копировать элемент C:\src\a C:\dst\b -Recurse

C:\                 C:\
D─dst ├─dst
S─src | B─ б
  A─a | ├─bar.txt
    Bar─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
Другие вопросы по тегам