Копировать файлы Powershell по сети

Обновлено: 16.05.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 . Это приводит к копированию содержимого исходной папки, но не сохраняет структуру папок. Обратите внимание, что файлы с тем же именем перезаписываются в папке назначения.

Параметры

Запрашивает подтверждение перед запуском командлета.

< /tr>

Указывает, что этот командлет сохраняет объекты-контейнеры во время операции копирования. По умолчанию для параметра Container установлено значение True.

Тип:SwitchParameter
Псевдонимы:cf
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:Истина
Принять ввод конвейера:Ложь
Допускать подстановочные знаки:False

Этот параметр не поддерживается ни одним поставщиком, установленным вместе с PowerShell. Чтобы выдать себя за другого пользователя или повысить свои учетные данные при запуске этого командлета, используйте Invoke-Command.

< /tr>
Тип:PSCredential
Позиция:Имя
Значение по умолчанию:Текущий пользователь
Принять ввод конвейера:Истина
Допускать подстановочные знаки:False

Указывает путь к новому местоположению. По умолчанию используется текущий каталог.

Чтобы переименовать копируемый элемент, укажите новое имя в значении параметра Destination.

Тип:Строка
Позиция:1
Значение по умолчанию:Текущий каталог
Принять ввод конвейера:Истина
Допускать подстановочные знаки:False

Указывает в виде массива строк элемент или элементы, которые этот командлет исключает из операции. Значение этого параметра определяет параметр Path. Введите элемент пути или шаблон, например *.txt . Подстановочные знаки разрешены. Параметр Exclude действует, только если команда включает содержимое элемента, например C:\Windows\* , где подстановочный знак указывает содержимое каталога C:\Windows.

Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера: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.

Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:False< /td>
Допускать подстановочные знаки:True

Указывает путь к одному или нескольким расположениям. Значение LiteralPath используется точно так, как оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одинарные кавычки сообщают PowerShell, что никакие символы не следует интерпретировать как управляющие последовательности.

Тип:String [ ]
Псевдонимы:PSPath, LP
Позиция:Имя
Значение по умолчанию:Нет< /td>
Принимать ввод конвейера:True
Допускать подстановочные знаки: Ложь

Возвращает объект, представляющий элемент, с которым вы работаете. По умолчанию этот командлет не создает никаких выходных данных.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:False
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Указывает в виде массива строк путь к копируемым элементам. Подстановочные знаки разрешены.

Тип:Строка [ ]
Позиция:0
Значение по умолчанию:Нет
Принять ввод конвейера:True< /td>
Допускать подстановочные знаки:True

Указывает, что этот командлет выполняет рекурсивное копирование.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:False
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Указывает объект PSSession, в который копируется удаленный файл. При использовании этого параметра параметр Destination относится к локальному пути на удаленном компьютере.

Тип:PSSession
Позиция:Имя
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:False

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

< /tr>

Входные данные

Вы можете передать строку, содержащую путь к этому командлету.

Результаты

Нет или объект, представляющий скопированный элемент

При использовании параметра PassThru этот командлет возвращает объект, представляющий скопированный элемент. В противном случае этот командлет не создает никаких выходных данных.

Примечания

Этот командлет предназначен для работы с данными, предоставленными любым поставщиком. Чтобы получить список поставщиков, доступных в вашем сеансе, введите Get-PSProvider . Дополнительные сведения см. в разделе about_Providers.

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

Команды для копирования файлов всегда существовали во всех языках оболочки. В среде PowerShell самый популярный способ получить копию файла или папки в сценарии PowerShell из точки А в точку Б — использовать командлет PowerShell Copy-Item. Этот командлет позволяет нам копировать файл и папку, а также дает нам возможность повторно использовать файлы в папке, использовать подстановочные знаки для выбора файлов, которые нам нужно скопировать, и даже использовать PowerShell Remoting для копирования файлов!

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

С помощью Copy-Item PowerShell позволяет разработчику копировать файлы и папки различными способами.

Оглавление

Основное использование

В простейшем случае командлет Copy-Item копирует один файл из точки А в точку Б, используя параметр Path в качестве пути к исходному файлу и параметр Destination в качестве пути к папке назначения.

Этот командлет также может копировать пустые папки.Я перечислю элементы в папке C:\EmptyFolder, а затем скопирую их.

Возможно, в папке есть файл, доступный только для чтения. По умолчанию Copy-Item не перезаписывает его. Чтобы принудительно переопределить, просто добавьте параметр Force.

Избирательность с помощью Copy-Item

Помимо копирования отдельного файла или папки, мы также можем скопировать все содержимое папки. Параметр Path объекта Copy-Item принимает подстановочные знаки, такие как звездочка для соответствия одному или нескольким символам или знак вопроса для соответствия только одному символу.

Объединение нескольких папок вместе

Еще одна интересная функция Copy-Item – возможность одновременного копирования нескольких папок. Передавая несколько путей в параметр Path, Copy-Item просматривает каждый из них, копирует либо папку, либо файл(ы) в зависимости от пути и «объединяет» их все в одном месте назначения.

Рекурсивное копирование файлов

Возможно, вам не повезет, и все файлы будут в одной папке без папок. Обычно мы сталкиваемся с ситуациями, когда у нас есть много подпапок в родительской папке, файлы в которых мы также хотели бы скопировать. Используя параметр Recurse в Copy-Item , он с удовольствием просматривает каждую вложенную папку и рекурсивно копирует все файлы и папки в каждой.

Обратите внимание, что я передаю файлы и папки из Get-ChildItem непосредственно в Copy-Item. Copy-Item имеет конвейерную поддержку!

Преимущества использования параметра PassThru

Многие командлеты в PowerShell имеют параметр PassThru. Командлеты, которые обычно ничего не возвращают, могут возвращать объекты, которыми они манипулируют, используя параметр PassThru. Этот командлет ничем не отличается. Когда я впервые начал писать сценарии, я никогда не использовал этот параметр, потому что не чувствовал в этом необходимости.

Например, если бы я хотел скопировать файл в удаленное место, а затем сослаться на этот файл позже в своем сценарии, я бы сделал что-то вроде этого:

Этот метод работает, но может быть и лучше. Вместо определения переменной для удаленного пути, почему бы просто не захватить объект, возвращаемый командлетом Copy-Item при использовании вместо этого параметра PassThru? Возвращаемые объекты всегда будут иметь путь к файлу назначения.

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

Одной интересной функцией PowerShell v5 является способность этого командлета не использовать протокол SMB по умолчанию для передачи файла, а вместо этого использовать WinRM и удаленный сеанс PowerShell. Используя параметр Session, Copy-Item использует существующий сеанс PowerShell и таким образом передает файлы. Это отличный способ обойти брандмауэры, а когда сеанс связи зашифрован, это еще и дополнительный уровень безопасности.

Мы могли скопировать файл File.txt через SMB, надеясь, что общий ресурс администратора C$ доступен и использовали путь назначения \\WEBSRV1\c$ . Поскольку вместо этого мы использовали параметр ToSession, путь назначения всегда будет локальным путем к компьютеру, на котором запущен удаленный сеанс.

Обзор

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

Дополнительная литература

Ненавидите рекламу? Хотите поддержать писателя? Получите многие из наших руководств в виде руководства по ATA.

Ещё от ATA Learning & Partners

Резервное копирование Office 365 для чайников

Лучшее руководство по защите данных Microsoft Office 365. Изучите готовые функции безопасности.

Руководства ATA

ATA известна своими высококачественными письменными учебными пособиями в виде сообщений в блогах. Поддержите ATA с помощью электронных книг ATA Guidebook PDF, доступных в автономном режиме и без рекламы!

Краткое содержание: Эд Уилсон, специалист по сценариям Microsoft, рассказывает об использовании Windows PowerShell для копирования коллекции скриптов на общий сетевой диск.

Эд Уилсон, специалист по сценариям Microsoft, здесь. Итак, сегодня понедельник в Шарлотте, Северная Каролина, США. Сегодня день кардио. Я провожу день, бегая от встречи к встрече. Я также провожу значительное количество времени, прыгая через обручи, чтобы уложиться в различные сроки для элементов, которые не имеют времени выполнения. Конечным результатом является отличная тренировка, которая расходует несколько сотен калорий. Как и при беге на беговой дорожке, немного сложно увидеть реальный прогресс. Но такие вещи часто необходимы.

Примечание. Если вы пропустили вчерашний гостевой блог Windows PowerShell MVP, Бартека Белявски, «Как я выиграл Сценарные игры, пропуск в TechEd и стал MVP», вернитесь и прочитайте его. Это действительно вдохновляет.

В любом случае, поскольку процесс бездействия системы занимает значительное время, важно, чтобы остальные процессы работали эффективно.Одна проблема, с которой я всегда сталкивался, связана с поиском сценариев, которые я написал. Во-первых, мне трудно вспомнить, какие сценарии я написал, а если я не помню, что написал сценарий, мне трудно его найти. Другими словами… Часто я просматриваю свои сценарии, а не ищу их. Это одна из причин, по которой я даю своим скриптам такие описательные имена — чтобы мне было легче узнавать их, как только я их найду.

На следующем изображении я показываю папку сценариев, содержащую сценарии, которые я написал для комплекта ресурсов Windows 7, опубликованного Microsoft Press.

Изображение вывода команды

Для большинства глав я написал в среднем 15 сценариев. Но для некоторых глав я не написал ни одного сценария, а для других глав написал целых 40 сценариев. Кроме того, каждая коллекция скриптов связана с определенной темой. Поэтому, если мне нужно найти сценарий, который я написал, который устанавливает статический IP-адрес, маску подсети, шлюз по умолчанию и DNS-сервер, я трачу много времени на клики или использую поиск, чтобы попытаться найти сценарий.

Во всяком случае, для меня проще поискать в одной папке скрипт с названием вроде Set-StaticIPAddress.ps1. Однако мысль о том, чтобы щелкнуть 35 папок, скопировать и вставить в другую папку, меня действительно пугает, не говоря уже о том, что мое запястье и щелкающий палец, вероятно, сломаются примерно на полпути в процессе. Нет, это работа для Windows PowerShell, а не для мыши. Да, перо мощнее меча, а Windows PowerShell мощнее мыши.

Мне потребовалось меньше минуты, чтобы придумать следующую команду.

каталог C:\data\BookDOcs\Win7ResKit\Scripts -Recurse -Filter *.ps1 |

Get-ChildItem –path C:\data\BookDOcs\Win7ResKit\Scripts -Recurse -Filter *.ps1 |

Об этой команде следует помнить несколько вещей. Во-первых, когда я указываю путь для копирования файлов, разрешаются подстановочные знаки. Следовательно, можно ожидать, что команда, подобная следующей, сработает. Это не потому, что он указывает на конкретный файл, поэтому путь должен указывать на папку, которая служит отправной точкой.

каталог C:\data\BookDOcs\Win7ResKit\Scripts\*.ps1 – Recurse

В своей команде я мог бы использовать параметр Include вместо параметра Filter, потому что параметр Include изменяет Path параметр. Таким образом, показанная здесь команда указывает, что я хочу начать с каталога \scripts и копаться вниз, пока не достигну дна (это часть команды Recurse). Затем я хочу включить только те файлы, которые заканчиваются расширением ps1. Когда вы используете параметр Include, вам нужно использовать Recurse переключитесь, чтобы он был эффективным.

каталог C:\data\BookDOcs\Win7ResKit\Scripts\ –Recurse -include *.ps1

Вместо использования параметра Include я решил использовать параметр Filter. Идея состоит в том, что Фильтр должен быть более эффективным, поскольку провайдер должен фильтровать файлы, прежде чем возвращать их в Windows PowerShell, вместо того, чтобы возвращать все в Windows PowerShell и заставлять Windows PowerShell выполнять фильтрацию.

Чтобы проверить эту идею, я использую командлет Measure-Command. Сначала я тестирую оператор Include. Вот команда, которую я запускаю.

Результаты показывают, что выполнение команды заняло 88 миллисекунд — впечатляющий показатель. Команда и связанный с ней вывод показаны на следующем изображении.

Изображение вывода команды

После перезагрузки (чтобы позаботиться о любых преимуществах кэширования) я использую командлет Measure-Command, чтобы увидеть производительность параметра Filter. Вот команда Я использую.

Результаты показывают, что командный инструмент 107 миллисекунд (на 19 миллисекунд больше). Имейте в виду, что командлет Measure-Command не точен на миллисекундном уровне; таким образом, результаты, по сути, говорят о том, что обе команды в основном выполняли одно и то же. Команда и вывод команды показаны здесь.

Изображение вывода команды

Вы должны иметь в виду, что этот небольшой тест, безусловно, не является окончательным. Вы не должны полагаться на него, когда вам нужно переместить большие объемы массивных данных. Но для небольших операций, таких как та, которую я только что выполнил, используйте либо параметр Filter, либо параметр Include, в зависимости от того, какой из них вам удобнее.В конце концов, если вам потребовались дополнительные пять минут, чтобы ваша команда заработала только потому, что вы думаете, что Filter будет работать быстрее, вы просто растратили свое преимущество в 19 миллисекунд впустую.

Я желаю вам отличного дня и отличной недели. Я с нетерпением жду встречи с вами завтра.

Читайте также:

Тип:SwitchParameter
Псевдонимы:wi
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False