Powershell Copy-To - если каталог назначения существует, копирует в существующий каталог - PullRequest
0 голосов
/ 03 декабря 2018

Да, у меня есть простой 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 \ из" -destination "C: \ test \ в"

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 голосов
/ 03 декабря 2018

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

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

Copy-Item C:\src\a C:\dst\b -Recurse

C:\                 C:\
├─dst               ├─dst
| └─b               | └─b
└─src               |   └─<b>a</b>
  └─a           &rArr;   |     <b>├─bar.txt</b>
    ├─bar.txt       |     <b>└─baz.txt</b>
    └─baz.txt       └─src
                      └─a
                        ├─bar.txt
                        └─baz.txt

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

Copy-Item C:\src\a C:\dst\b -Recurse

C:\                 C:\
├─dst               ├─dst
└─src               | └─<b>b</b>
  └─a               |   <b>├─bar.txt</b>
    ├─bar.txt   &rArr;   |   <b>└─baz.txt</b>
    └─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
...