Копирование файлов в новую папку назначения с сохранением структуры папок - PullRequest
0 голосов
/ 05 марта 2019

Я использую командлет PowerShell Copy-Item, чтобы попытаться скопировать структуру каталогов.Эта структура содержит несколько подпапок, которые мне нужно поддерживать.Я использую команду:

Copy-Item <<src folder>> <<dest folder>> -Recurse

Если я убедился, что папка назначения существует в первую очередь, то все в порядке.Однако, если он не существует, PowerShell создаст его, но скопированная структура папок пропустит первый уровень.например, если моя структура исходных папок имеет вид:

D:\tmp\copytest
└─ 1
   ├─ 1.1
   │  └─ 1.1.txt
   └─ 1.txt

, и я использую команду

Copy-Item "D:\tmp\copytest\*" "D:\tmp\copied" -Recurse

, тогда папка назначения выглядит следующим образом, если я не создала «скопированную» папку взаранее:

D:\tmp\copied
├─ 1.1
│  └─ 1.1.txt
└─ 1.txt

т.е. нет подпапки '1'.

Хотя обеспечение целевой папки не представляет особой проблемы, мне интересно попытаться понять, что здесь происходит.

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Если вы хотите, чтобы Copy-Item повторялся правильно,
Источник и назначение должны быть сбалансированы.

На моем пустом RamDisk этот скрипт:

$Drive = "A:"
New-Item -Path "$Drive\tmp\copytest\1\1.1"         -ItemType Directory | Out-Null
New-Item -Path "$Drive\tmp\copytest\1\1.txt"       -ItemType File      | Out-Null
New-Item -Path "$Drive\tmp\copytest\1\1.1\1.1.txt" -ItemType File      | Out-Null

Tree /F $Drive

Copy-Item -Path "$Drive\tmp\copytest\" `
   -Destination "$Drive\tmp\copied\" -Recurse

Tree /F $Drive

имеет такой вывод:

Auflistung der Ordnerpfade für Volume RamDisk
A:\
└───tmp
    └───copytest
        └───1
            │   1.txt
            │
            └───1.1
                    1.1.txt

Auflistung der Ordnerpfade für Volume RamDisk
A:\
└───tmp
    ├───copied
    │   └───1
    │       │   1.txt
    │       │
    │       └───1.1
    │               1.1.txt
    │
    └───copytest
        └───1
            │   1.txt
            │
            └───1.1
                    1.1.txt
0 голосов
/ 06 марта 2019

Поведение Copy-Item зависит от того, существует путь к каталогу, указанный параметром -Destination, или нет.

Copy-Item -Path "D:\tmp\copytest\1" -Destination "D:\tmp\copied" -Recurse

Если «скопированный» каталог не существует, каталог «1» копируется с именем «скопировано». С другой стороны, если «скопированный» каталог существует, каталог «1» будет скопирован непосредственно в «скопированный» каталог.

Если вы копируете каталог, вам следует заранее проверить, существует ли каталог назначения. Простой способ ниже.

Copy-Item -Path "D:\tmp\copytest\*" -Destination (mkdir "D:\tmp\copied" -Force) -Recurse
0 голосов
/ 05 марта 2019

Я не могу воссоздать вашу проблему.

New-Item -Path C:\test\1 -ItemType Directory | Out-Null
New-Item -Path C:\test\1\1.txt -ItemType File | Out-Null
New-Item -Path C:\test\1\1.1 -ItemType Directory | Out-Null
New-Item -Path C:\test\1\1.1\1.1.txt -ItemType File | Out-Null
Copy-Item -Path "C:\test\*" -Destination "C:\temp" -Recurse
Get-ChildItem C:\temp -Recurse | Select-Object -ExpandProperty FullName

Вывод:

C:\temp\1
C:\temp\1\1.1
C:\temp\1\1.txt
C:\temp\1\1.1\1.1.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...