Доступ к буферу обмена в пакетном файле Windows - PullRequest
23 голосов
/ 26 июля 2011

Есть идеи, как получить доступ к буферу обмена Windows с помощью командного файла?

Ответы [ 9 ]

21 голосов
/ 01 апреля 2013

Чтобы установить содержимое буфера обмена, как сказали Крис Торнтон, Клаату и других , используйте %windir%\system32\clip.exe.


Обновление 2:

Для быстрой однострочности, вы можете сделать что-то вроде этого:

powershell -sta "add-type -as System.Windows.Forms; [windows.forms.clipboard]::GetText()"

Захват и анализ с помощью петли for /F при необходимости. Это не будет выполнено так быстро, как решение JScript ниже, но имеет преимущество в простоте.


Обновленное решение:

Спасибо Джонатану за указание на возможности таинственного htmlfile COM-объекта для получения буфера обмена. Можно получить пакетный гибрид + JScript для извлечения содержимого буфера обмена. Фактически, для его запуска требуется всего одна строка JScript и строка cscript, и это намного быстрее, чем решение PowerShell / .NET, предложенное ранее.

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "getclip=cscript /nologo /e:JScript "%~f0""

rem // If you want to process the contents of the clipboard line-by-line, use
rem // something like this to preserve blank lines:
for /f "delims=" %%I in ('%getclip% ^| findstr /n "^"') do (
    setlocal enabledelayedexpansion
    set "line=%%I" & set "line=!line:*:=!"
    echo(!line!
    endlocal
)

rem // If all you need is to output the clipboard text to the console without
rem // any processing, then remove the "for /f" loop above and uncomment the
rem // following line:
:: %getclip%

goto :EOF

@end // begin JScript hybrid chimera
WSH.Echo(WSH.CreateObject('htmlfile').parentWindow.clipboardData.getData('text'));

Старое решение:

С помощью .NET можно получить текст буфера обмена из консоли Windows без каких-либо сторонних приложений. Если у вас установлено powershell, вы можете извлечь содержимое буфера обмена, создав воображаемое текстовое поле и вставив в него. ( Источник )

Add-Type -AssemblyName System.Windows.Forms
$tb = New-Object System.Windows.Forms.TextBox
$tb.Multiline = $true
$tb.Paste()
$tb.Text

Если у вас нет powershell, вы все равно можете скомпилировать простое приложение .NET для вывода текста буфера обмена в консоль. Вот пример C #. ( Вдохновение )

using System;
using System.Threading;
using System.Windows.Forms;
class dummy {
    [STAThread]
    public static void Main() {
        if (Clipboard.ContainsText()) Console.Write(Clipboard.GetText());
    }
}

Вот пакетный скрипт, который объединяет оба метода. Если powershell существует в %PATH%, используйте его. В противном случае найдите компилятор / компоновщик C # и создайте временное приложение .NET. Как вы можете видеть в комментариях к пакетному сценарию, вы можете захватывать содержимое буфера обмена с помощью цикла for /f или просто выводить их на консоль.

:: clipboard.bat
:: retrieves contents of clipboard

@echo off
setlocal enabledelayedexpansion

:: Does powershell.exe exist within %PATH%?
for %%I in (powershell.exe) do if "%%~$PATH:I" neq "" (
    set getclip=powershell "Add-Type -AssemblyName System.Windows.Forms;$tb=New-Object System.Windows.Forms.TextBox;$tb.Multiline=$true;$tb.Paste();$tb.Text"
) else (
rem :: If not, compose and link C# application to retrieve clipboard text
    set getclip=%temp%\getclip.exe
    >"%temp%\c.cs" echo using System;using System.Threading;using System.Windows.Forms;class dummy{[STAThread]
    >>"%temp%\c.cs" echo public static void Main^(^){if^(Clipboard.ContainsText^(^)^) Console.Write^(Clipboard.GetText^(^)^);}}
    for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*csc.exe"') do (
        if not exist "!getclip!" "%%I" /nologo /out:"!getclip!" "%temp%\c.cs" 2>NUL
    )
    del "%temp%\c.cs"
    if not exist "!getclip!" (
        echo Error: Please install .NET 2.0 or newer, or install PowerShell.
        goto :EOF
    )
)

:: If you want to process the contents of the clipboard line-by-line, use
:: something like this to preserve blank lines:
for /f "delims=" %%I in ('%getclip% ^| findstr /n "^"') do (
    set "line=%%I" & set "line=!line:*:=!"
    echo(!line!
)

:: If all you need is to output the clipboard text to the console without
:: any processing, then remove the above "for /f" loop and uncomment the
:: following line:

:: %getclip%

:: Clean up the mess
del "%temp%\getclip.exe" 2>NUL
goto :EOF
4 голосов
/ 18 февраля 2015

Уменьшение (в новой версии Windows):

set _getclip=powershell "Add-Type -Assembly PresentationCore;[Windows.Clipboard]::GetText()"
for /f "eol=; tokens=*" %I in ('%_getclip%') do set CLIPBOARD_TEXT=%I
  1. Первая строка объявляет powershell командлет.
  2. Вторая строка запускается и записывает вывод консоли этого командлета в переменную окружения CLIPBOARD_TEXT (ближайший способ cmd.exe сделать bash стиль backtick ` capture)

Обновление 2017-12-04:

Спасибо @Saintali за указание на то, что PowerShell 5.0 добавляет Get-Clipboard в качестве командлетов верхнего уровня, так что теперь он работает как один слой:

for /f "eol=; tokens=*" %I in ('powershell Get-Clipboard') do set CLIPBOARD_TEXT=%I

2 голосов
/ 16 мая 2012

Команда clip хороша для передачи текста в буфер обмена, но она не может читать из буфера обмена. В vbscript / javascript есть способ для чтения / записи буфера обмена, но он использует автоматизацию и невидимый экземпляр, если Internet Explorer делает это довольно жирным.

Лучший инструмент, который я нашел для работы с буфером обмена из скрипта, - это бесплатный инструмент Nirsoft NirCmd.

http://www.nirsoft.net/utils/nircmd.html

Это как швейцарский армейский нож пакетных команд в одном маленьком .exe-файле. Для команд буфера обмена вы бы сказали что-то вроде

буфер обмена nircmd [Действие] [Параметр]

Кроме того, вы можете напрямую ссылаться на содержимое буфера обмена в любой из его команд, используя в качестве аргумента переменную ~ $ clipboard $. Nircmd также содержит команды для запуска других программ или команд, поэтому его можно использовать для передачи содержимого буфера обмена в качестве аргумента другим пакетным командам таким образом.

Действия с буфером обмена:

      set - set the specified text into the clipboard. 
 readfile - set the content of the specified text file into the clipboard. 
    clear - clear the clipboard. 
writefile - write the content of the clipboard to a file. (text only) 
  addfile - add the content of the clipboard to a file. (text only) 
saveimage - Save the current image in the clipboard into a file. 
copyimage - Copy the content of the specified image file to the clipboard. 
  saveclp - Save the current clipboard data into Windows .clp file. 
  loadclp - Load Windows .clp file into the clipboard. 

Обратите внимание, что большинство программ всегда записывают текстовую копию в буфер обмена, даже если они записывают в буфер обмена специальную копию в формате RTF или HTML, но они записываются как содержимое с использованием другого типа формата буфера обмена, поэтому вы не сможете доступ к этим форматам, если ваша программа явно не запрашивает этот тип данных из буфера обмена.

1 голос
/ 03 марта 2016

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

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

c:\>pclip > MyNewFile.txt

или вы хотите выполнить скопированную команду ...

c:\>pclip | cmd
1 голос
/ 03 декабря 2014

Для извлечения содержимого буфера обмена из вашего пакетного сценария: «чистого» пакетного решения не существует.

Если вам нужно 100% пакетное решение для встраивания, вам нужно сгенерировать другой языковой файл из вашей партии.

Вот решение для короткого и пакетного встраивания, которое генерирует файл VB (обычно устанавливается в большинстве окон)

1 голос
/ 27 июля 2011

В Vista или выше она встроена. Просто передайте вывод в программу «клип».Вот рецензия (мной): http://www.clipboardextender.com/general-clipboard-use/command-window-output-to-clipboard-in-vista Статья также содержит ссылку на бесплатную утилиту (написанную мной, я думаю) под названием Dos2Clip, которую можно использовать в XP.Я вижу, что получил вопрос задом наперед, мое решение ВЫХОДЫ в буфер обмена не читает его.извините!

Обновление: наряду с Dos2Clip есть Clip2Dos (в том же zip), который будет отправлять текст буфера обмена на стандартный вывод.Так что это должно работать для вас.Исходный код Паскаля включен в почтовый индекс.

0 голосов
/ 05 марта 2019

Лучший способ, который я знаю, это использовать автономный инструмент под названием WINCLIP .

. Вы можете получить его здесь: Outwit

Использование:

  • Сохранить буфер обмена в файл: winclip -p file.txt
  • Скопировать стандартный вывод в буфер обмена: winclip -c Пример: Sed 's/find/replace/' file | winclip -c
  • Трубаclipboard to sed: winclip -p | Sed 's/find/replace/'
  • Использовать вывод winclip (буфер обмена) в качестве аргумента другой команды:

    FOR /F "tokens=* usebackq" %%G in ('winclip -p') Do (YOUR_Command %%G ) Обратите внимание, что если в буфере обмена есть несколько строк, этоКоманда разберет их один за другим.

Возможно, вы также захотите взглянуть на getclip & putclip tools: CygUtils для Windows но winclipлучше на мой взгляд.

0 голосов
/ 03 октября 2015

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

@ECHO OFF
//Name of TEMP TXT Files
SET TXTNAME=CLIP.TXT
//VBA SCRIPT
:: VBS SCRIPT
ECHO.Set Shell = CreateObject("WScript.Shell")>_TEMP.VBS
ECHO.Set HTML = CreateObject("htmlfile")>>_TEMP.VBS
ECHO.TXTPATH = "%TXTNAME%">>_TEMP.VBS
ECHO.Set FileSystem = CreateObject("Scripting.FileSystemObject")>>_TEMP.VBS 
ECHO.Set File = FileSystem.OpenTextFile(TXTPATH, 2, true)>>_TEMP.VBS
ECHO.File.WriteLine HTML.ParentWindow.ClipboardData.GetData("text")>>_TEMP.VBS
ECHO.File.Close>>_TEMP.VBS
cscript//nologo _TEMP.VBS

:: VBS CLEAN UP
DEL _TEMP.VBS

SET /p streamURL=<%TXTNAME%

DEL %TXTNAME%

:: 1) The location of Player
SET mvpEXE="D:\Tools\Programs\MVP\mpv.com"

:: Open stream to video player
%mvpEXE% %streamURL%


@ECHO ON
0 голосов
/ 17 ноября 2014

Это может быть не точный ответ, но он будет полезен для вашего квеста.

Оригинальное сообщение: Посетите https://groups.google.com/d/msg/alt.msdos.batch/0n8icUar5AM/60uEZFn9IfAJ На вопрос Охота на Роджера Ответилот Уильям Аллен


Много шагов по очистке:

Шаг 1) создайте файл 'bat' с именем Copy.bat на рабочем столе, используя любые текстовые редакторы, скопируйте и вставьте приведенный ниже коди сохраните его.

  @ECHO OFF
  SET FN=%1
  IF ()==(%1) SET FN=H:\CLIP.TXT

  :: Open a blank new file
  REM New file>%FN%

  ECHO.set sh=WScript.CreateObject("WScript.Shell")>_TEMP.VBS
  ECHO.sh.Run("Notepad.exe %FN%")>>_TEMP.VBS
  ECHO.WScript.Sleep(200)>>_TEMP.VBS
  ECHO.sh.SendKeys("^+{end}^{v}%%{F4}{enter}{enter}")>>_TEMP.VBS
  cscript//nologo _TEMP.VBS

  ECHO. The clipboard contents are:
  TYPE %FN%

  :: Clean up
  DEL _TEMP.VBS
  SET FN=

Шаг 2) создайте пустой текстовый файл (в моем случае «CLIP.txt» на H Drive) или в любом месте, убедитесь, что вы обновили путь вСкопируйте файл .bat в папку «FN = H: \ CLIP.txt» с указанием пути к файлу назначения.

Вот и все.

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

Использует:

Я использую егопередавать данные с удаленно подключенных компьютеров, на которых отключено копирование / вставка между различными подключениями;где общий диск (H :) является общим для всех подключений.

...