Копировать файлы Powershell по сети
Обновлено: 21.11.2024
С помощью PowerShell Copy-Item легко копировать файлы из командной строки. Как только вы укажете исходное и целевое местоположение, это просто произойдет. К сожалению, многие администраторы не задумываются о том, как происходит этот процесс, пока он не заработает.
Независимо от того, думаете вы об этом или нет, все сетевые соединения TCP (например, копии файлов SMB) используют сетевые порты для передачи битов. Чтобы процесс копирования файла доставил файл из точки А в точку Б, порт должен быть полностью открыт до конечного узла. В случае копии файла SMB этот порт — 445. Это обычный порт, который обычно открыт внутри, за исключением некоторых ситуаций с высоким уровнем безопасности или в демилитаризованной зоне.
Элемент копирования PowerShell
Если вы работаете в среде с высоким уровнем безопасности или вам необходимо передавать файлы из внутренней сети в демилитаризованную зону, которая может иметь различные ограничения на количество портов, как вы можете гарантировать, что ваши сценарии смогут постоянно копировать файлы на узлы? Один из способов сделать это — использовать командлет Copy-Item PowerShell v5 с новым параметром –ToSession.
Этот параметр появился в Windows Management Framework (WMF) версии 5 с помощью командлета Copy-Item. Он предоставляет способ передачи файлов по той же ссылке, которую вы могли бы использовать сегодня для удаленного выполнения команд на компьютерах с такими командлетами, как Invoke-Command.
При использовании PowerShell Copy-Item с помощью традиционного метода SMB необходимо указать параметры Path и Destination. Если вы хотите скопировать файл с именем file1.txt внутри C:\Folder на удаленный компьютер SERVER1 на его C:\, вы можете сделать это:
Обратите внимание, что здесь вы используете путь UNC к \\SERVER1\c$. Это будет важно через минуту.
Сеансы удаленного взаимодействия PowerShell
Но что, если SMB по какой-то причине заблокирован или вы все равно используете Invoke-Command для запуска команд на SERVER1? Вы можете использовать сеансы удаленного взаимодействия PowerShell для передачи файла через WinRM вместо SMB. Для этого необходимо установить новый сеанс удаленного взаимодействия, а затем передать файл через этот сеанс.
Сначала необходимо создать новый сеанс удаленного взаимодействия PowerShell. Для этого вы можете использовать командлет New-PSSession и назначить сеанс переменной $session.
При этом будет использоваться проверка подлинности Kerberos для установления нового сеанса удаленного взаимодействия PowerShell, что является наиболее распространенным методом в среде Active Directory.
Далее необходимо указать параметр ToSession и локальный путь на удаленном компьютере для параметра Destination.
Обратите внимание, что теперь вы используете C:\ в качестве места назначения, а не путь UNC. Эта команда выполнит то же самое, что и предыдущая, но будет использовать сеанс для инкапсуляции файла и передачи его через WinRM.
Не забудьте удалить сеанс, когда закончите, используя команду Remove-PSSession.
Если вы не собираетесь повторно использовать сеанс для чего-либо еще, вы также можете создать сеанс и разорвать его (все одновременно).
На этом все! В следующий раз, когда вы окажетесь в среде, где удаленное взаимодействие PowerShell разрешено, но SMB ограничено, или вы уже используете сеанс удаленного взаимодействия для чего-то другого, вы можете передать сеанс в Copy-Item, чтобы легко перенести файл из точки А. в точку Б. Не останавливайтесь на достигнутом; прочтите нашу электронную книгу «Как автоматизировать использование PowerShell», чтобы узнать о других хитростях PowerShell.
Командлет Copy-Item копирует элемент из одного места в другое в том же пространстве имен. Например, он может скопировать файл в папку, но не может скопировать файл на диск сертификата.
Этот командлет не вырезает и не удаляет копируемые элементы. Конкретные элементы, которые может копировать командлет, зависят от поставщика PowerShell, предоставляющего элемент. Например, он может копировать файлы и каталоги на диск файловой системы, а также ключи и записи реестра на диск реестра.
Этот командлет может копировать и переименовывать элементы в одной команде. Чтобы переименовать элемент, введите новое имя в значение параметра Destination. Чтобы переименовать элемент, а не копировать его, используйте командлет Rename-Item.
Примеры
Пример 1. Скопируйте файл в указанный каталог
В этом примере файл mar1604.log.txt копируется в каталог C:\Presentation. Исходный файл не удаляется.
Пример 2. Копирование содержимого каталога в существующий каталог
В этом примере содержимое каталога C:\Logfiles копируется в существующий каталог C:\Drawings. Каталог файлов журнала не копируется.
Если каталог Logfiles содержит файлы в подкаталогах, эти подкаталоги копируются с неповрежденными деревьями файлов. По умолчанию для параметра Container установлено значение True, что сохраняет структуру каталогов.
Если вам нужно включить в копию каталог Logfiles, удалите \* из пути. Например:
Копируемый элемент -Путь "C:\Logfiles" -Назначение "C:\Drawings" -Recurse
Если путь C:\Drawings не существует, командлет копирует все файлы из папки Logfiles в один файл C:\Drawings .
Пример 3. Копирование каталога и содержимого в новый каталог
В этом примере копируется содержимое исходного каталога C:\Logfiles и создается новый целевой каталог. Новый целевой каталог \Logs создается в C:\Drawings .
Чтобы включить имя исходного каталога, скопируйте его в существующий целевой каталог, как показано в примере 2. Или назовите новый целевой каталог так же, как исходный каталог.
Если путь включает \* , все содержимое файла каталога, включая деревья подкаталогов, копируется в новый каталог назначения. Например:
Копируемый элемент -Путь "C:\Logfiles\*" -Назначение "C:\Drawings\Logs" -Recurse
Пример 4. Скопируйте файл в указанный каталог и переименуйте файл
В этом примере командлет Copy-Item используется для копирования сценария Get-Widget.ps1 из каталога \\Server01\Share в каталог \\Server12\ScriptArchive. В рамках операции копирования команда меняет имя элемента с Get-Widget.ps1 на Get-Widget.ps1.txt , чтобы его можно было прикрепить к сообщениям электронной почты.
Пример 5. Копирование файла на удаленный компьютер
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует test.log из папки D:\Folder001 в папку C:\Folder001_Copy на удаленном компьютере, используя информацию о сеансе, хранящуюся в переменной $Session. Исходный файл не удаляется.
Пример 6. Копирование папки на удаленный компьютер
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует папку D:\Folder002 в каталог C:\Folder002_Copy на удаленном компьютере, используя информацию о сеансе, хранящуюся в переменной $Session. Любые вложенные папки или файлы не копируются без использования переключателя Recurse. Операция создает папку Folder002_Copy, если она еще не существует.
Пример 7. Рекурсивное копирование всего содержимого папки на удаленный компьютер
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует все содержимое папки D:\Folder003 в каталог C:\Folder003_Copy на удаленном компьютере, используя информацию о сеансе, хранящуюся в переменной $Session. Подпапки копируются с неповрежденными деревьями файлов. Операция создает папку Folder003_Copy, если она еще не существует.
Пример 8. Скопируйте файл на удаленный компьютер, а затем переименуйте файл
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует scriptingexample.ps1 из папки D:\Folder004 в папку C:\Folder004_Copy на удаленном компьютере, используя информацию о сеансе, хранящуюся в переменной $Session. В рамках операции копирования команда изменяет имя элемента с scriptingexample.ps1 на scriptingexample_copy.ps1 , чтобы его можно было прикрепить к сообщениям электронной почты. Исходный файл не удаляется.
Пример 9. Копирование удаленного файла на локальный компьютер
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует test.log из удаленного каталога C:\MyRemoteData\ в локальную папку D:\MyLocalData, используя информацию о сеансе, хранящуюся в переменной $Session. Исходный файл не удаляется.
Пример 10. Скопируйте все содержимое удаленной папки на локальный компьютер
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует все содержимое удаленной папки C:\MyRemoteData\scripts в локальную папку D:\MyLocalData, используя информацию о сеансе, хранящуюся в переменной $Session. Если папка scripts содержит файлы во вложенных папках, эти вложенные папки копируются с неповрежденными деревьями файлов.
Пример 11. Рекурсивное копирование всего содержимого удаленной папки на локальный компьютер
Сеанс создается для удаленного компьютера с именем Server01 с учетными данными Contoso\User01 и сохраняет результаты в переменной с именем $Session .
Командлет Copy-Item копирует все содержимое удаленной папки C:\MyRemoteData\scripts в локальную папку D:\MyLocalData\scripts, используя информацию о сеансе, хранящуюся в переменной $Session. Поскольку используется параметр Recurse, операция создает папку сценариев, если она еще не существует.Если папка scripts содержит файлы во вложенных папках, эти вложенные папки копируются с неповрежденными деревьями файлов.
Пример 12. Рекурсивное копирование файлов из дерева папок в текущую папку
В этом примере показано, как копировать файлы из многоуровневой структуры папок в одну плоскую папку. Первые три команды показывают существующую структуру папок и содержимое двух файлов с именами file3.txt .
Командлет Copy-Item имеет для параметра Container значение $false . Это приводит к копированию содержимого исходной папки, но не сохраняет структуру папок. Обратите внимание, что файлы с тем же именем перезаписываются в папке назначения.
Параметры
Запрашивает подтверждение перед запуском командлета.
Тип: | SwitchParameter |
Псевдонимы: | cf |
Позиция: | Имя |
Значение по умолчанию: | False | < /tr>
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | Истина |
Принять ввод конвейера: | Ложь |
Допускать подстановочные знаки: | False |
Этот параметр не поддерживается ни одним поставщиком, установленным вместе с PowerShell. Чтобы выдать себя за другого пользователя или повысить свои учетные данные при запуске этого командлета, используйте Invoke-Command.
Тип: | PSCredential |
Позиция: | Имя |
Значение по умолчанию: | Текущий пользователь |
Принять ввод конвейера: | Истина | < /tr>
Допускать подстановочные знаки: | False |
Указывает путь к новому местоположению. По умолчанию используется текущий каталог.
Чтобы переименовать копируемый элемент, укажите новое имя в значении параметра Destination.
Тип: | Строка |
Позиция: | 1 |
Значение по умолчанию: | Текущий каталог |
Принять ввод конвейера: | Истина td> |
Допускать подстановочные знаки: | False |
Указывает в виде массива строк элемент или элементы, которые этот командлет исключает из операции. Значение этого параметра определяет параметр Path. Введите элемент пути или шаблон, например *.txt . Подстановочные знаки разрешены. Параметр Exclude действует, только если команда включает содержимое элемента, например C:\Windows\* , где подстановочный знак указывает содержимое каталога C:\Windows.
Тип: | Строка [ ] |
Позиция: | Название td> |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False< /td> |
Допускать подстановочные знаки: | True |
Указывает фильтр для уточнения параметра Path. Поставщик FileSystem — это единственный установленный поставщик PowerShell, который поддерживает использование фильтров. Вы можете найти синтаксис языка фильтров файловой системы в about_Wildcards. Фильтры более эффективны, чем другие параметры, потому что поставщик применяет их, когда командлет получает объекты, а не фильтрует объекты PowerShell после их извлечения.
Тип: | Строка |
Позиция: | Именованный |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | True |
Указывает, что этот командлет копирует элементы, которые нельзя изменить иначе, например копирует файл или псевдоним, доступный только для чтения.
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | False |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Указывает объект PSSession, из которого копируется удаленный файл. При использовании этого параметра параметры Path и LiteralPath относятся к локальному пути на удаленном компьютере.
Тип: | PSSession |
Позиция: | Имя |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Указывает в виде массива строк элемент или элементы, которые этот командлет включает в операцию. Значение этого параметра определяет параметр Path. Введите элемент пути или шаблон, например "*.txt" . Подстановочные знаки разрешены.Параметр Include действует, только если команда включает содержимое элемента, например C:\Windows\* , где подстановочный знак указывает содержимое каталога C:\Windows.
Тип: | Строка [ ] |
Позиция: | Название td> |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False< /td> |
Допускать подстановочные знаки: | True |
Указывает путь к одному или нескольким расположениям. Значение LiteralPath используется точно так, как оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одинарные кавычки сообщают PowerShell, что никакие символы не следует интерпретировать как управляющие последовательности.
Тип: | String [ ] |
Псевдонимы: | PSPath, LP |
Позиция: | Имя |
Значение по умолчанию: | Нет< /td> |
Принимать ввод конвейера: | True |
Допускать подстановочные знаки: | Ложь |
Возвращает объект, представляющий элемент, с которым вы работаете. По умолчанию этот командлет не создает никаких выходных данных.
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | False |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Указывает в виде массива строк путь к копируемым элементам. Подстановочные знаки разрешены.
Тип: | Строка [ ] |
Позиция: | 0 td> |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | True< /td> |
Допускать подстановочные знаки: | True |
Указывает, что этот командлет выполняет рекурсивное копирование.
Тип: | SwitchParameter |
Позиция: | Именованный |
Значение по умолчанию: | False |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Указывает объект PSSession, в который копируется удаленный файл. При использовании этого параметра параметр Destination относится к локальному пути на удаленном компьютере.
Тип: | PSSession |
Позиция: | Имя |
Значение по умолчанию: | Нет |
Принять ввод конвейера: | False |
Допускать подстановочные знаки: | False |
Показывает, что произойдет, если командлет запустится. Командлет не запущен.
Тип: | SwitchParameter |
Псевдонимы: | wi |
Позиция: | Имя |
Значение по умолчанию: | False | < /tr>
Принимать ввод конвейера: | False |
Допускать подстановочные знаки: | False |