在Windows批处理文件中访问剪贴板

时间:2011-07-26 15:06:09

标签: windows batch-file clipboard

知道如何使用批处理文件访问Windows剪贴板吗?

11 个答案:

答案 0 :(得分:21)

要设置剪贴板的内容,如Chris Thornton,klaatu和bunches of others所说,请使用%windir%\system32\clip.exe


更新2:

对于快速单行,您可以这样做:

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

如果需要,使用for /F循环进行捕获和解析。这不会像下面的JScript解决方案那样快速执行,但它确实具有简单的优势。


更新了解决方案:

Thanks Jonathan用于指向用于检索剪贴板的神秘htmlfile COM对象的功能。可以调用批处理+ JScript混合来检索剪贴板的内容。实际上,它只需要一行JScr​​ipt和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
  1. 第一行声明powershell命令行开关。
  2. 第二行运行并将此命令行开关的控制台输出捕获到CLIPBOARD_TEXT环境变量(cmd.exe最近的方式bash样式反引号`捕获)< / LI>

    更新2017-12-04:

    感谢@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%批处理解决方案,则需要从批处理中生成其他语言文件。

Here is a short and batch embed solution which generate a VB file (Usually installed on most windows)

答案 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