Командлет PowerShell Копія-елемент використовується для копіювання файлів між локальними, мережевими каталогами або між комп’ютерами по мережі через WinRM. Командлет Copy-Item надає велику кількість опцій, які можна використовувати в різних сценаріях копіювання файлів і каталогів (за своїми можливостями цей командлет майже не поступається утиліті robocopy). наприклад:

  • перезапис файлів (override)
  • фільтрація по імені / шаблоном
  • виняток на ім’я / шаблоном
  • Багатослівний режим
  • Копіювання файлів з / на віддалені комп’ютери

Почнемо з простих прикладів використання Copy-Item і будемо переходити до більш складним.

Копіювання файлів і каталогів

Щоб скопіювати один файл 1.txt з каталогу C: SourceFolder в F: DestFolder , виконайте:

Copy-Item -Path "C:SourceFolder1.txt" -Destination "F:DestFolder1.txt"

Можна використовувати скорочений синтаксис командлет, пропустивши вказівку параметрів Path і Destination:

cpi "C:SourceFolder1.txt" "F:DestFolder1.txt"

Тепер скопіюємо каталог C: SourceFolder folder в F: DestFolder folder. В папці folder знаходиться файл 1.txt. Зверніть увагу що без ключа -Recurse, папка folder копіюється без вмісту:

Copy-Item -Path "C:SourceFolderfolder" -Destination "F:DestFolderfolder" -Recurse

За допомогою Copy-Item також можна просто об’єднати файли з кілька директорій в одну (злиття директорії), для цього потрібно перерахувати директорії в ключі -Path:

Copy-Item -Path "C:SourceFolder*", "C:SourceFolder2*", "C:SourceFolder3*" -Destination "F:DestFolder"

Копіювання з заміною та копіювання з заміною read-only файлів

Copy-Item за замовчуванням при копіюванні замінює файли в цільовому каталозі. Ніяких додаткових параметрів вказувати не потрібно. При копіюванні каталогу, якщо потрібно замінити каталогу в цільової папці, потрібно використовувати ключ –Сила, Інакше нічого не вийде “Елемент folder з вказаним ім’ям вже існує – DirectoryExists“.

copy-item DirectoryExists

Для перезапису файлу з атрибутом read-only, потрібно використовувати ключ -Force. Якщо його не використовувати, ви отримаєте помилку “відмовлено в доступу по шляху … CopyFileInfoItemUnauthorizedAccessError“.

copy-item CopyFileInfoItemUnauthorizedAccessError

Щоб скопіювати файл з перезаписом файлу з read-only атрибутом використовуйте параметр Force.

Copy-Item -Path "C:SourceFolder1.txt" -Destination "F:DestFolder1.txt" -Force

Порада. Щоб не плутатися, ключ -Force можна розглядати як ключ для копіювання з заміною.

Щоб Copy-Item скопіював файли з однієї папки в іншу без заміни існуючих файлів, можна використовувати цей простий скрипт

Copy-Item (Join-Path "C:SourceFolder" "*") "F:DestFolder" -Exclude (Get-ChildItem "F:DestFolder") -Recurse

Цей скрипт скопіює всі файли і папки з C: SourceFolder в F: DestFolder без заміни файлів вже існуючих в F: DestFolder

Копіювання з фільтрацією по шаблону

За допомогою Copy-Item можна скопіювати файли / директорії вибрані за допомогою wildcard символу * або за допомогою символу?. Також підтримуються деякі регулярні вирази

  • * – позначає будь-яку кількість будь-яких символів
  • ? – позначає 1 будь-який символ
  • [a-z], [0-9] – символи між az і цифри між 0 і 9

Для прикладу візьмемо таку структуру файлів:

джерело

Виконаємо копіювання командою:

Copy-Item -Path "C:SourceFolderfol*" -Destination "F:DestFolder"

Результат в F: DestFolder

замінити елемент копіювання

Тепер чистимо папку призначення і виконуємо:

Copy-Item -Path "C:SourceFolderfolder[0-3]" -Destination "F:DestFolder"

результат:

результат

Папка без цифри в закінчень скопіювати, тому що folder[0-3] має на увазі що після folder буде як мінімум ще 1 символ між 0 і 3

Виключення файлів при копіюванні

За допомогою ключа -Exclude можна виключити файли при копіюванні. Наприклад, следующай команда скопіює всі файли крім файлів з розширенням txt.

Copy-Item -Path "C:SourceFolder*" -Destination "F:DestFolder" -Recurse -Force -Exclude "*.txt"

Аналогічним же чином можна застосувати ключ -Include, наприклад

Copy-Item -Path "C:SourceFolder*" -Destination "F:DestFolder" -Recurse -Force -Include "*.txt"

Скопіює тільки txt файли. Хоча для простоти набагато зручніше використовувати при копіюванні вид -Path "C:SourceFolder*.txt".

Копіювання файлів на віддалений комп’ютер по мережі

Copy-File може копіювати не тільки по SMB протоколу, а й через WinRM (WSMan).

Створіть нову сесію з комп’ютером testnode1 і виконайте копіювання в її контексті:

$session = New-PSSession -ComputerName testnode1
Copy-Item -Path "C:SourceFolder*" -ToSession $session -Destination "C:SourceFolder" -Recurse -Force

Ця команда скопіює файли з локального комп’ютера з директорії C: SourceFolder на комп’ютер testnode1 в C: SourceFolder .

Примітка. Доступність WSMan на віддаленому комп’ютері можна перевірити за допомогою командлета Тест-WSMan.

Test-WSMan -ComputerName testnode1

Тест-WSMan

Якщо WSMan не налаштований, ви можете виконати його швидку конфігурацію. Для цього відкрийте командний рядок з правами адміністратора і виконайте winrm quickconfig

winrm quickconfig

Також можна копіювати і через звичайні мережеві SMB кулі, для цього просто використовуйте UNC формат мережевого шляху.

Copy-Item -Path "C:SourceFolder*" -Destination "\testnode1C$copy_tutorial"

Ви маєте можливість копіювати файл з віддаленого комп’ютера. Принцип такий же, що і при копіюванні файлів на віддалений комп’ютер, за винятком параметра -ToSession, замість нього потрібно використовувати –З сесії:

$session = New-PSSession -ComputerName testnode1
Copy-Item -FromSession $session -Path "C:SourceFolder*" -Destination "F:DestFolder" -Recurse -Force

Ця команда скопіює вміст папки C: SourceFolder с комп’ютера testnode1 на локальний комп’ютер в директорію F: DestFolder

ключ PassThru

Командлет Copy-Item (як і багато інших командлети PowerShell) не повертає результатів в консоль. Параметр PassThru застосовується скриптах, або для лог-файлів, коли потрібно отримати список скопійованих файлів і працювати з ним далі. Розглянемо приклад

$items = Copy-Item -Path "C:SourceFolder*" –Destination "\testnode1C$copy_tutorial" -PassThru

Мінлива $items буде містити список скопійованих файлів, з яким ви можете працювати дальше.Ето значить що ви можете безпосередньо працювати з цими файлами. Наприклад виконавши команду Remove-Item $items[0], Ви видалите директорію folder.

копія елемента passthru

ключ Verbose

При використанні ключа -Verbose ви отримаєте докладний журнал операцій копіювання. Наприклад, висновок команди

Copy-Item -Path "C:SourceFolder*.txt" -Destination "F:DestFolder" -Recurse -Force -Verbose

копія елемента багатослівний лог

Кілька корисних скриптів з Copy-Item

Скопіювати тільки файли:

Get-ChildItem "C:SourceFolder" -File -Recurse | Copy-Item -Destination "F:DestFolder"

Скопіювати структуру папок, без файлів:

$path = Get-ChildItem "C:SourceFolder" -Recurse | ?{$_.PsIsContainer -eq $true}
$dest = "F:DestFolder"
$parent = $path[0].Parent.Name
$path | foreach {
$_.FullName -match "$parent.+"
New-Item -ItemType directory ($dest + $Matches[0])
}

Copy-Item дуже простий і зручний у використанні командлет PowerShell для виконання операцій копіювання і переміщення файлів. У поєднанні з іншими інструментами PowerShell, Copy-Item є також потужним інструментом для написання скриптів.

Leave a Reply

Your email address will not be published. Required fields are marked *