Как скопировать файл в 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:\temp | d:\temp | Создаёт только папку temp |
| c:\temp\ | d:\temp\ | Создаёт только папку temp |
| c:\temp\* | d:\temp | Создайте папку temp и скопируйте только файлы из c:\temp |
| c:\temp\ | d:\temp -Рекурсивно | Копирует папку с подкаталогами и всем содержимым |
В примерах ниже я собираюсь использовать следующую структуру папок с подсобной папкой в качестве источника:
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. Если у вас есть вопросы, просто оставьте комментарий ниже.
