Любая идея, как получить доступ к буферу Windows с помощью пакетного файла?
Доступ к буферу обмена в пакетном файле Windows
Ответ 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% пакетное решение, вам нужно будет сгенерировать файл другого языка из вашей партии.
Ответ 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