知道如何使用批处理文件访问Windows剪贴板吗?
答案 0 :(得分:21)
要设置剪贴板的内容,如Chris Thornton,klaatu和bunches of others所说,请使用%windir%\system32\clip.exe
。
对于快速单行,您可以这样做:
powershell -sta "add-type -as System.Windows.Forms; [windows.forms.clipboard]::GetText()"
如果需要,使用for /F
循环进行捕获和解析。这不会像下面的JScript解决方案那样快速执行,但它确实具有简单的优势。
Thanks Jonathan用于指向用于检索剪贴板的神秘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
,则可以通过创建虚构文本框并粘贴到其中来检索剪贴板内容。 (Source)
Add-Type -AssemblyName System.Windows.Forms
$tb = New-Object System.Windows.Forms.TextBox
$tb.Multiline = $true
$tb.Paste()
$tb.Text
如果您没有powershell
,您仍然可以编译一个简单的.NET应用程序来将剪贴板文本转储到控制台。这是一个C#示例。 (Inspiration)
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
答案 1 :(得分: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
样式反引号`
捕获)< / LI>
醇>
感谢@Saintali指出PowerShell 5.0将Get-Clipboard
添加为顶级cmdlet,因此现在可以作为一个内容使用:
for /f "eol=; tokens=*" %I in ('powershell Get-Clipboard') do set CLIPBOARD_TEXT=%I
答案 2 :(得分:2)
剪辑命令可以将文本管道传输到剪贴板,但无法从剪贴板中读取。在vbscript / javascript中有一种方法可以读取/写入剪贴板,但它使用自动化和一个不可见的实例,如果Internet Explorer这样做它非常胖。
我发现从脚本处理剪贴板的最佳工具是Nirsoft的免费NirCmd工具。
http://www.nirsoft.net/utils/nircmd.html
它像一个瑞士军刀批处理命令都在一个小的.exe文件中。对于剪贴板命令,你会说像
nircmd clipboard [动作] [参数]
另外,您可以使用〜$ 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副本写入剪贴板,但这些副本使用不同的剪贴板格式类型编写为内容,因此您可能无法访问这些格式,除非您的程序明确地从剪贴板请求该类型的数据。
答案 3 :(得分:1)
使用Vista或更高版本,它是内置的。只需将输出输出到“剪辑”程序。 这是一篇文章(由我): http://www.clipboardextender.com/general-clipboard-use/command-window-output-to-clipboard-in-vista 这篇文章还包含一个名为Dos2Clip的免费实用工具(由我编写,我认为)的链接,可以在XP上使用。
编辑:我看到我已经向后回答了问题,我的解决方案OUTPUTS到了剪贴板,没有看到它。遗憾!更新:与Dos2Clip一起,是Clip2Dos(在同一个zip中),它会将剪贴板文本发送到stdout。所以这对你有用。 Pascal源包含在zip中。
答案 4 :(得分:1)
要从批处理脚本中检索剪贴板内容:没有&#34; pure&#34;批量解决方案。
如果您想要嵌入100%批处理解决方案,则需要从批处理中生成其他语言文件。
答案 5 :(得分:1)
管道输出到剪贴板是由剪辑提供的,正如其他人所说的那样。要从剪贴板中读取输入,请使用this bundle中的pclip工具。那里还有很多其他好东西。
例如,您正在浏览在线教程,并且想要创建一个包含剪贴板内容的文件...
c:\>pclip > MyNewFile.txt
或者您想要执行复制的命令......
c:\>pclip | cmd
答案 6 :(得分:0)
这可能不是确切的答案,但它对你的任务有帮助。
原帖: 访问https://groups.google.com/d/msg/alt.msdos.batch/0n8icUar5AM/60uEZFn9IfAJ 提问 Roger Hunt 回答 William Allen
更清洁的步骤:
步骤1)使用任何文本编辑器在桌面上创建名为Copy.bat的'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)创建一个空白文本文件(在我的案例中为H驱动器中的“CLIP.txt”)或任何地方,确保在“FN = H”下的Copy.bat文件中更新路径:\ CLIP.txt'带有目标文件路径。
就是这样。
因此,基本上当你从任何地方复制任何文本并从桌面运行Copy.bat文件时,它会更新CLIP.txt文件中的剪贴板内容并保存
用途:
我用它从远程连接的机器传输数据,在不同的连接之间禁用复制/粘贴;其中共享驱动器(H :)对所有连接都是通用的。
答案 7 :(得分:0)
我所知,最好的方法是使用一个名为 WINCLIP 的独立工具。
您可以从这里获取它:Outwit
用法:
winclip -p file.txt
winclip -c
例如:Sed 's/find/replace/' file | winclip -c
winclip -p | Sed 's/find/replace/'
使用winclip输出(剪贴板)作为另一个命令的参数:
FOR /F "tokens=* usebackq" %%G in ('winclip -p') Do (YOUR_Command %%G )
请注意,如果剪贴板中有多行,此命令将一一解析它们。
您可能还想看看 getclip 和 putclip 工具:CygUtils for Windows,但我认为Winclip更好。
答案 8 :(得分:0)
多行
问题已解决,但仍然令人失望。
我被迫将一个命令一分为二。
首先,他们很了解文本和服务字符,但不了解退格键。
第二个理解退格键,但不理解许多服务字符。
任何人都可以团结他们吗?
记事本++(应在其应打开的位置)被注释掉,因为有时该窗口无法访问输入字符,因此您需要确保其处于活动状态。
当然,最好使用笔记本进程的PID输入字符,但是...
wmic的请求打开了很长时间,因此在关闭bat文件之前不要关闭记事本窗口。
const url = 'http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric&appid=${process.env.API_KEY}'
答案 9 :(得分:0)
这是使用mshta的一种方法:
@echo off
:printClip
for /f "usebackq tokens=* delims=" %%i in (
`mshta "javascript:Code(close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(clipboardData.getData('Text'))));"`
) do (
echo cntent of the clipboard:
echo %%i
)
直接从控制台访问它的方法相同:
for /f "usebackq tokens=* delims=" %i in (`mshta "javascript:Code(close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(clipboardData.getData('Text'))));"`) do @echo %i
答案 10 :(得分:-1)
由于所有答案都令人困惑,这里我的代码没有延迟或额外的窗口打开从剪贴板复制的流链接:
@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