在Windows批处理文件访问剪贴板
不知道如何使用批处理文件来访问Windows剪贴板?
Any idea how to access the Windows clipboard using a batch file?
要设置剪贴板中的内容,如克里斯·桑顿,克拉图,和的 纷纷表示,使用%WINDIR%\\ SYSTEM32 \\ clip.exe
他人串>。
To set the contents of the clipboard, as Chris Thornton, klaatu, and bunches of others have said, use %windir%\system32\clip.exe
.
感谢乔纳森为指向神秘的能力 HTMLFILE
检索剪贴板COM对象。它可以调用批处理+ JScript的混合检索剪贴板中的内容。事实上,只需要JScript中的一行,和 CSCRIPT
行来触发它,比提供的PowerShell中/ .NET解决方案更快更早。
Thanks Jonathan for pointing to the capabilities of the mysterious htmlfile
COM object for retrieving the clipboard. It is possible to invoke a batch + JScript hybrid to retrieve the contents of the clipboard. In fact, it only takes one line of JScript, and a cscript
line to trigger it, and is much faster than the PowerShell / .NET solution offered earlier.
@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'));
旧解决方案:
有可能检索从Windows控制台剪贴板文本,而不使用.NET任何第三方应用程序。如果你有的PowerShell
安装,你可以通过创建一个虚构的文本框,并粘贴到它获取剪贴板中的内容。 (来源)
Old solution:
It is possible to retrieve clipboard text from the Windows console without any 3rd-party applications by using .NET. If you have powershell
installed, you can retrieve the clipboard contents by creating an imaginary textbox and pasting into it. (Source)
Add-Type -AssemblyName System.Windows.Forms
$tb = New-Object System.Windows.Forms.TextBox
$tb.Multiline = $true
$tb.Paste()
$tb.Text
如果您还没有做的PowerShell
,你仍然可以编译一个简单的.NET应用程序转储剪贴板文本控制台。这里有一个C#示例。 (灵感)
If you don't have powershell
, you can still compile a simple .NET application to dump the clipboard text to the console. Here's a C# example. (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
循环捕捉剪贴板中的内容或简单地将它们转储到控制台。
Here's a batch script that combines both methods. If powershell
exists within %PATH%
, use it. Otherwise, find the C# compiler / linker and build a temporary .NET application. As you can see in the batch script comments, you can capture the clipboard contents using a for /f
loop or simply dump them to the console.
:: 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