Поиск по сайту:

Как скопировать файл в PowerShell с помощью Copy-Item


Мы можем использовать PowerShell для копирования файла с одного местоположения на другое с помощью команды Copy-Item. Местоположение может быть другой локальной папкой или удаленным компьютером. Кроме файлов, мы также можем копировать полные папки с подкаталогами и содержимым. И даже возможно фильтровать файлы, которые мы копируем.

В этой статье мы рассмотрим различные примеры того, как скопировать файл с помощью PowerShell.

Скопируйте файл с помощью PowerShell

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

Copy-Item -Path "C:\temp\files\la-ams-ad01-log-1.txt" -Destination "d:\temp\"

Copy is a shorthand for Copy-Item:
Copy "C:\temp\files\la-ams-ad01-log-1.txt" "d:\temp\"

Имейте в виду, что вам нужно закончить имя папки назначения обратной косой чертой \, иначе вы переименуете файл. Это также одна из полезных функций cmdlet Copy-Item, с помощью которой мы можем указать новое имя для файла в назначении:

Copy and rename the file:
Copy-Item -Path "C:\temp\files\la-ams-ad01-log-2.txt" -Destination "d:\temp\logfile.txt"

Копировать несколько файлов

Чтобы скопировать несколько файлов с помощью PowerShell, вы можете использовать фильтры, которые я объясню позже в статье, или выбрать несколько файлов в пути. Для этого вам нужно будет разделить каждый файл запятой. Для назначения вам нужно будет использовать папку.

Copy ad01-log-1.txt and ad01-log-2.txt
Copy-Item -Path C:\temp\files\ad01-log-1.txt,C:\temp\files\ad01-log-2.txt -Destination d:\temp\

Копировать папку в PowerShell

Мы также можем использовать cmdlet Copy-Item для копирования целой папки в новое место. Но когда речь идет о копировании папок, важно использовать правильное окончание в исходных и целевых путях:

ИсточникиНазначениеРезультаты
c:\tempd:\tempСоздаёт только папку temp
c:\temp\d:\temp\Создаёт только папку temp
c:\temp\*d:\tempСоздайте папку temp и скопируйте только файлы из c:\temp
c:\temp\d:\temp -РекурсивноКопирует папку с подкаталогами и всем содержимым
Копирование папок с помощью PowerShell

В примерах ниже я собираюсь использовать следующую структуру папок с подсобной папкой в качестве источника:

C:\TEMP\FILES
│   11022022-app.log
│   11032021-app.log
│   11032022-app.log
│   11102021-app.log
│   15032022-app.log
│   la-ams-ad01-log-1.txt
│   la-ams-ad01-log-2.txt
│   la-ams-ad01-log-3.txt
│   la-ams-ad01-log-4.txt
│   la-ams-file02-log-1.txt
│   la-ams-file02-log-2.txt
│
└───subfolder
        la-osl-ad01-log-1.txt
        la-osl-file01-log-1.txt
        LT3452-process-errors.log
        LT3452-process.log
        readme.txt

Чтобы скопировать только файлы и пустые подпапки из c:\temp\files, нам нужно будет использовать подстановочный знак для исходного пути:

Copy-Item -Path "C:\temp\files\*"  -Destination "d:\temp\"

Result
D:\TEMP
│   11022022-app.log
│   11032021-app.log
│   11032022-app.log
│   11102021-app.log
│   15032022-app.log
│   la-ams-ad01-log-1.txt
│   la-ams-ad01-log-2.txt
│   la-ams-ad01-log-3.txt
│   la-ams-ad01-log-4.txt
│   la-ams-file02-log-1.txt
│   la-ams-file02-log-2.txt
│
└───subfolder  # Note - Sub folder is empty

Чтобы скопировать весь контент, включая подпапки с помощью PowerShell, нам нужно указать параметр -recurce. Таким образом, содержимое подпапки также копируется в новое место:

Copy all content including subfolder:
Copy-Item -Path "C:\temp\files\*"  -Destination "d:\temp\" -Recurse

Result
D:\TEMP
│   11022022-app.log
│   11032021-app.log
│   11032022-app.log
│   11102021-app.log
│   15032022-app.log
│   la-ams-ad01-log-1.txt
│   la-ams-ad01-log-2.txt
│   la-ams-ad01-log-3.txt
│   la-ams-ad01-log-4.txt
│   la-ams-file02-log-1.txt
│   la-ams-file02-log-2.txt
│
└───subfolder
        la-osl-ad01-log-1.txt
        la-osl-file01-log-1.txt
        LT3452-process-errors.log
        LT3452-process.log
        readme.txt

Копировать и объединять несколько папок одновременно

Возможно, это не то, что вы будете часто использовать, но может быть очень полезным — возможность копировать и объединять несколько папок сразу с помощью cmdlet Copy-Item. Мы можем указать несколько исходных путей для cmdlet и один единственный путь назначения.

Таким образом, содержимое всех исходных мест будет скопировано в одно место:

 Copy-Item -Path c:\logs-server-A\*,c:\logs-server-b\* -Destination d:\logs

Фильтровать файлы для копирования

С помощью параметров Include и Exclude мы можем отфильтровывать, какие файлы копировать, а какие нет. Фильтр сопоставляется с полным именем файла (включая расширение) и с именами папок в вашем исходном пути.

Чтобы скопировать только файлы с расширением .log, мы можем использовать фильтр включения так:

Copy only files with the extension .log
Copy-Item -Path c:\temp\* -Destination d:\temp -Include *.log

Result
Note that the .log files from the subfolder are note copied
D:\TEMP
    11022022-app.log
    11032021-app.log
    11032022-app.log
    11102021-app.log
    15032022-app.log

Обратите внимание на подстановочный знак, который всегда требуется, если вы хотите отфильтровать по части имени. Полезно знать, что параметр -Recurse здесь не будет работать. Если у вас есть подпапки с файлами .log в них, они не будут скопированы. Фильтр применяется только к верхнему уровню пути.

Используя фильтр исключения

Исключение файлов работает так же. Мы можем указать часть имени файлов и папок, которые мы не хотим копировать. Имейте в виду, что если подпапка не соответствует строке исключения, она также будет скопирована вместе со всем содержимым.

Copy everything, except .log files:
Copy-Item -Path c:\temp\files\* -Destination d:\temp\ -Exclude *.log -Recurse

Result:
D:\TEMP
│   la-ams-ad01-log-1.txt
│   la-ams-ad01-log-2.txt
│   la-ams-ad01-log-3.txt
│   la-ams-ad01-log-4.txt
│   la-ams-file02-log-1.txt
│   la-ams-file02-log-2.txt
│
└───subfolder
        la-osl-ad01-log-1.txt
        la-osl-file01-log-1.txt
        readme.txt

Копирование файла на удаленный компьютер с помощью PowerShell

Также возможно копировать файлы на удаленный компьютер и с него с помощью PowerShell. Существует два способа сделать это: вы можете создать временный сетевой диск, используя командлет New-PSDrive, или сначала создать новую сессию PowerShell на удаленном компьютере.

Для этого вам нужно иметь доступ к удаленному компьютеру или использовать учетные данные удаленного компьютера для запуска PSSession:

$Session = New-PSSession -ComputerName "LazyServer01" -Credential "LazyAdmin\User01"

Создав сессии и сохранив их в переменной $session, мы можем копировать объекты в любое место на удаленном компьютере. В данном случае путь назначения - это локальный путь на удаленном компьютере, поэтому для копирования файлов во временную папку на удаленном компьютере вы можете просто использовать c:\temp в качестве пути назначения:

Copy all files from the local temp folder to the temp folder on the remote computer
Copy-Item -Path c:\temp\local\* -Destination c:\temp\remote\ -ToSession $Session -Recurse

Вы можете использовать тот же метод для копирования файлов с удаленного компьютера на ваш локальный компьютер с помощью PowerShell. В этом случае вам нужно использовать параметр -FromSession вместо -ToSession.

$Session = New-PSSession -ComputerName "LazyServer01" -Credential "LazyAdmin\User01"
Copy-Item -Path c:\temp\remote* -Destination c:\temp\local\ -FromSession $Session -Recurse

Завершение

Командлет PowerShell Copy-Item очень полезен, когда нужно копировать файлы на вашем локальном или удаленном компьютере. Его нельзя сравнить с мощной командой robocopy, но тем не менее, это все еще полезный командлет.

Я надеюсь, что эта статья помогла вам скопировать файл или папку с помощью PowerShell. Если у вас есть вопросы, просто оставьте комментарий ниже.