PowerShell Копирование в буфер обмена: за пределами Ctrl+C и Ctrl+V

При написании кода на PowerShell последнее, о чем вы могли подумать, – это буфер обмена Windows. Мы все, вероятно, знаем об известных сочетаниях клавиш Ctrl-C и Ctrl-V для копирования и вставки из буфера обмена, но это обычно делается через графический интерфейс. В наших сценариях PowerShell это не слишком полезно. Однако вы знали, что в PowerShell есть функция копирования в буфер обмена?

В этой статье я расскажу о том, как мы раньше получали функциональность копирования и вставки в PowerShell, а затем познакомлю вас с командлетами, которые предоставляет PowerShell начиная с версии 5.

До PowerShell v5 единственным способом копирования в буфер обмена было использование приложения clip.exe.

Старая-добрая clip.exe

Это приложение существует уже очень давно и работает надежно. Перенаправляя текст в clip.exe, вы можете скопировать текст в буфер обмена. Это работало, но всегда было неприятно, когда после каждого элемента добавлялся символ возврата каретки.

PS51> Write-Output 'Hello' | clip
The PowerShell copy to clipboard function can replace the old school clip.exe

Кроме того, у нас не было простого способа извлекать информацию из буфера обмена. Мы были вынуждены вручную вставлять содержимое, когда оно находилось в буфере обмена. С помощью встроенных команд буфера обмена это больше не проблема!

Теперь у нас есть два командлета, которые гораздо лучше решают эту проблему: Get-Clipboard и Set-Clipboard.

Команда PowerShell Set-Clipboard

Set-Clipboard заменяет clip.exe, но ведет себя точно так же. Теперь, вместо того чтобы перенаправлять вывод в clip, вы можете использовать Set-Clipboard. Если вы сделаете это, вы заметите, что последний символ возврата каретки исчезает при вставке содержимого куда-либо.

Буфер обмена теперь содержит только строку Hello.

PS> Write-Output 'Hello' | Set-Clipboard

Еще одна полезная функция Set-Clipboard – это параметр Append. Традиционно буфер обмена мог хранить только один элемент. Теперь, используя параметр Append с Set-Clipboard, вы можете добавлять неограниченное количество элементов без удаления предыдущих.

PS> Write-Output 'Hello' | Set-Clipboard -Append

Параметры Get-Clipboard

Даже если вы не используете Set-Clipboard для копирования содержимого в буфер обмена, вы все равно можете использовать Get-Clipboard, чтобы понять несколько различных типов, кроме простых строк. Например, если вы скопировали список файлов из Проводника и хотите получить этот список в своей консоли PowerShell, просто используйте параметр Format и значение FileDropList на Get-Clipboard.

PS51> Get-Clipboard -Format FileDropList

Directory: \\Mac\Home\Downloads


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------         8/1/2019  10:42 AM       17919094 00_03_xr30_whatyoushouldhave.mov


    Directory: \\Mac\Home\Documents\Snagit\Autosaved Captures.localized


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------         8/1/2019   1:58 PM      169144472 2019-08-01_13-47-55.mp4

Вы увидите, что он понимает, что тип данных в буфере обмена – это список файлов. Кроме того, то же самое можно сделать с изображениями и другими сущностями.

Скопируйте изображение из другого приложения и используйте параметр -Format Image для Get-Clipboard, чтобы получить различные свойства изображения.

PS51> Get-Clipboard -Format Image


Tag                  :
PhysicalDimension    : {Width=813, Height=113}
Size                 : {Width=813, Height=113}
Width                : 813
Height               : 113
HorizontalResolution : 96
VerticalResolution   : 96
Flags                : 335888
RawFormat            : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
PixelFormat          : Format32bppRgb
Palette              : System.Drawing.Imaging.ColorPalette
FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList       : {}
PropertyItems        : {}

Манипуляция буфером обмена в PowerShell Core

К сожалению, команды Get-Clipboard и Set-Clipboard недоступны в PowerShell Core (v6+), но вы все равно можете использовать их с помощью модуля WindowsCompatibility. Модуль WindowsCompatibility позволяет вам использовать cmdlets Windows PowerShell в PowerShell Core.

После установки модуля WindowsCompatibility выполните команду Invoke-WinCommand и оберните ссылки на Get-Clipboard и Set-Clipboard внутри нее.

PS622> Invoke-WinCommand -ScriptBlock {'This is on the clipboard' | Set-ClipBoard}
PS622> Invoke-WinCommand -ScriptBlock {Get-ClipBoard}
This is on the clipboard

Вы обнаружите, что можете читать и записывать в буфер обмена так же, как вы делали это в Windows PowerShell.

Резюме

Теперь вы можете делать гораздо больше с буфером обмена в PowerShell. Возможность копирования в буфер обмена с помощью PowerShell стала возможной благодаря командам Get-Clipboard и Set-Clipboard. Эти cmdlet-ы позволяют вам использовать PowerShell для копирования в буфер обмена и интеллектуальной вставки из буфера обмена.

Для полного описания cmdlet-ов ознакомьтесь с детальной справкой:

PS51> Get-Help Set-Clipboard -Detailed
PS51> Get-Help Get-Clipboard -Detailed

Это даст вам все возможные параметры, которые вы можете попробовать.

Source:
https://adamtheautomator.com/powershell-copy-to-clipboard/