web-dev-qa-db-ja.com

Windowsバッチファイルでクリップボードにアクセスする

バッチファイルを使用してWindowsクリップボードにアクセスする方法はありますか?

26
random21

クリップボードの内容を設定するには、Chris Thornton、klaatu、および 他の束 が言ったように、%windir%\system32\clip.exeを使用します。


アップデート2:

簡単なワンライナーの場合、次のようなことができます:

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

必要に応じて、for /Fループを使用してキャプチャおよび解析します。これは、以下のJScriptソリューションほど速く実行されませんが、単純さという利点があります。


更新されたソリューション:

Jonathanに感謝 クリップボードを取得するための神秘的なhtmlfile COMオブジェクトの機能をポイントしてください。バッチ+ JScriptハイブリッドを呼び出して、クリップボードの内容を取得することができます。実際、JScriptの1行と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アプリケーションをコンパイルして、クリップボードのテキストをコンソールにダンプできます。これはC#の例です。 ( インスピレーション

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
22
rojo

スリム化(十分に新しいバージョンのWindows):

_set _getclip=powershell "Add-Type -Assembly PresentationCore;[Windows.Clipboard]::GetText()"
for /f "eol=; tokens=*" %I in ('%_getclip%') do set CLIPBOARD_TEXT=%I
_
  1. 1行目はpowershellコマンドレットを宣言しています。
  2. 2行目が実行され、このコマンドレットのコンソール出力を_CLIPBOARD_TEXT_環境変数(_cmd.exe_に最も近い方法でbashスタイルのバックティック_`_キャプチャ)にキャプチャします。

2017-12-04の更新:

PowerShell 5.0が_Get-Clipboard_を最上位のコマンドレットとして追加することを指摘してくれた@Saintaliに感謝します。これにより、これは1つのライナーとして機能します。

for /f "eol=; tokens=*" %I in ('powershell Get-Clipboard') do set CLIPBOARD_TEXT=%I

4

クリップコマンドは、テキストをクリップボードにパイプするのに適していますが、クリップボードから読み取ることはできません。 vbscript/javascriptにはクリップボードを読み書きする方法がありますが、Internet Explorerがかなり太っている場合、自動化と非表示のインスタンスを使用します。

スクリプトからクリップボードを操作するために私が見つけた最高のツールは、Nirsoftの無料のNirCmdツールです。

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

これは、1つの小さな.exeファイルにまとめられたバッチコマンドのスイスアーミーナイフのようなものです。クリップボードのコマンドについては、次のように言うでしょう

nircmdクリップボード[アクション] [パラメーター]

さらに、引数として〜$ 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コピーをクリップボードに書き込んでいる場合でも、常にプレーンテキストのコピーをクリップボードに書き込みますが、それらは異なるクリップボード形式のタイプを使用してコンテンツとして書き込まれるため、プログラムがクリップボードからそのタイプのデータを明示的に要求しない限り、これらの形式にアクセスできない場合があります。

2
klaatu

他の人が言っているように、出力をパイプするtoクリップボードは、クリップによって提供されます。クリップボードから入力を読み取るには、 このバンドル のpclipツールを使用します。他にもたくさんの良いものがあります。

たとえば、オンラインチュートリアルを行っており、クリップボードの内容を含むファイルを作成したいとします...

c:\>pclip > MyNewFile.txt

または、コピーしたコマンドを実行したい...

c:\>pclip | cmd
1
bbsimonbb

すべての答えは混乱を招くので、ここで遅延なしのコードまたはクリップボードからコピーされたストリームリンクを開くための余分なウィンドウ:

@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
1
emery

Vista以降では、組み込みです。出力を「clip」プログラムにパイプするだけです。これが(私が)書いたものです: http://www.clipboardextender.com/general-clipboard-use/command-window-output-to-clipboard-in-Vista この記事には、Dos2Clipと呼ばれる無料のユーティリティ(私が書いたと思います)へのリンクも含まれています。これは、XPで使用できます。

編集:私は質問を逆に持っていることがわかりました、私のソリューションはクリップボードに出力され、それを読みません。ごめんなさい!

更新:Dos2Clipと一緒に、Clip2Dos(同じZip内)があり、クリップボードのテキストをstdoutに送信します。だからこれはあなたのために働くはずです。 PascalソースはZipに含まれています。

1
Chris Thornton

バッチスクリプトからクリップボードのコンテンツを取得するには、「純粋な」バッチソリューションはありません。

埋め込み100%バッチソリューションが必要な場合は、バッチから他の言語ファイルを生成する必要があります。

VBファイル(通常、ほとんどのウィンドウにインストールされています) =を生成する短いバッチ埋め込みソリューションです==

1
Jonathan

私が知る最良の方法は、[〜#〜] winclip [〜#〜]というスタンドアロンツールを使用することです。

ここから入手できます: Outwit

用途:

  • クリップボードをファイルに保存:_winclip -p file.txt_
  • Stdoutをクリップボードにコピー:_winclip -c_例:_Sed 's/find/replace/' file | winclip -c_
  • クリップボードをsedにパイプする:_winclip -p | Sed 's/find/replace/'_
  • Winclip出力(クリップボード)を別のコマンドの引数として使用します。

    FOR /F "tokens=* usebackq" %%G in ('winclip -p') Do (YOUR_Command %%G )クリップボードに複数の行がある場合、このコマンドはそれらを1つずつ解析します。

また、getclipputclipツールを確認することもできます: CygUtils for Windows しかしwinclip私の意見ではより良いです。

0
KorkOoO

これは正確な答えではないかもしれませんが、クエストには役立ちます。

元の投稿:訪問 https://groups.google.com/d/msg/alt.msdos.batch/0n8icUar5AM/60uEZFn9IfAJAsked byロジャーハント回答者ウィリアムアレン


よりクリーンなステップ:

ステップ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:\ CLIP.txt」の下の.batファイルに宛先ファイルのパスを指定します。

それでおしまい。

したがって、基本的にはどこからでもテキストをコピー、デスクトップからCopy.batファイルを実行すると、CLIP.txtファイルがクリップボードの内容で更新され、 それを保存します

用途:

異なる接続間でコピー/貼り付けが無効になっているリモート接続マシンからデータを転送するために使用します。ここで、共有ドライブ(H :)はすべての接続に共通です。

0
Srivastav Reddy