Подтвердить что ты не робот

Доступ к буферу обмена в пакетном файле Windows

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

4b9b3361

Ответ 1

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


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

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

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

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


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

Спасибо Джонатану за указание на возможности таинственного объекта COM htmlfile для извлечения буфера обмена. Вы можете вызвать пакетный + 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, чтобы выгрузить текст буфера обмена на консоль. Вот пример С#. (Вдохновение)

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

Здесь пакет script, который объединяет оба метода. Если powershell существует внутри %PATH%, используйте его. В противном случае найдите компилятор/компоновщик С# и создайте временное приложение .NET. Как вы можете видеть в пакетных script комментариях, вы можете захватывать содержимое буфера обмена с помощью цикла 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

Ответ 2

С Vista или выше он встроен. Просто выведите вывод в программу "clip". Вот запись (по мне): http://www.clipboardextender.com/general-clipboard-use/command-window-output-to-clipboard-in-vista В статье также содержится ссылка на бесплатную утилиту (написанную мной, я думаю) под названием Dos2Clip, которую можно использовать в XP.

ИЗМЕНИТЬ: Я вижу, что я задал вопрос назад, мое решение OUTPUTS в буфер обмена, не читает его. извините!

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

Ответ 3

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

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

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

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

nircmd clipboard [Действие] [Параметр]

Кроме того, вы можете напрямую ссылаться на содержимое буфера обмена в любой из своих команд, используя переменную ~ $clipboard $variable в качестве аргумента. 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 в буфер обмена, но они записываются как контент с использованием другого типа формата буфера обмена, поэтому вы не сможете доступ к этим форматам, если ваша программа явно не запрашивает этот тип данных из буфера обмена.

Ответ 4

Похудение (в новой версии Windows):

set _getclip=powershell "Add-Type -Assembly PresentationCore;[Windows.Clipboard]::GetText()"
for /f "eol=; tokens=*" %I in ('%_getclip%') do set CLIPBOARD_TEXT=%I
  • Первая строка объявляет команду powershell.
  • Вторая строка запускает и выводит консольный вывод этого командного элемента в переменную окружения 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

Ответ 5

Чтобы извлечь содержимое буфера обмена из вашей партии script: нет "чистого" пакетного решения.

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

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

Ответ 6

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

Оригинальное сообщение: Посетите 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-диске) или в любом месте, убедитесь, что вы обновили путь в файле Copy.bat в разделе "FN = H:\CLIP.txt 'с вашим файлом пути к файлу.

Что это.

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

Применение:

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

Ответ 7

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

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

c:\>pclip > MyNewFile.txt

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

c:\>pclip | cmd

Ответ 8

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

@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