webentwicklung-frage-antwort-db.com.de

Greifen Sie auf die Zwischenablage in der Windows-Batchdatei zu

Haben Sie eine Idee, wie Sie mit einer Batch-Datei auf die Windows-Zwischenablage zugreifen können?

23
random21

Um den Inhalt der Zwischenablage festzulegen, verwenden Sie %windir%\system32\clip.exe, wie Chris Thornton, klaatu und Bündel anderer gesagt haben.


Update 2:

Für einen schnellen Einzeiler könnten Sie so etwas tun:

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

Erfassen und analysieren Sie ggf. mit einer for /F-Schleife. Dies wird nicht so schnell ausgeführt wie die unten beschriebene JScript-Lösung, hat jedoch den Vorteil der Einfachheit.


Aktualisierte Lösung:

Danke Jonathan für den Hinweis auf die Fähigkeiten des geheimnisvollen htmlfile COM-Objekts für das Abrufen der Zwischenablage. Es ist möglich, einen Batch + JScript-Hybrid aufzurufen, um den Inhalt der Zwischenablage abzurufen. Tatsächlich dauert es nur eine JScript-Zeile und eine cscript-Zeile, um es auszulösen, und ist viel schneller als die zuvor angebotene PowerShell/.NET-Lösung.

@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'));

Alte Lösung:

Es ist möglich, Text in der Zwischenablage von der Windows-Konsole ohne Anwendungen von Drittanbietern mithilfe von .NET abzurufen. Wenn Sie powershell installiert haben, können Sie den Inhalt der Zwischenablage abrufen, indem Sie ein imaginäres Textfeld erstellen und in dieses einfügen. ( Quelle )

Add-Type -AssemblyName System.Windows.Forms
$tb = New-Object System.Windows.Forms.TextBox
$tb.Multiline = $true
$tb.Paste()
$tb.Text

Wenn Sie powershell nicht haben, können Sie immer noch eine einfache .NET-Anwendung kompilieren, um den Text der Zwischenablage in die Konsole zu kopieren. Hier ist ein C # -Beispiel. ( Inspiration )

using System;
using System.Threading;
using System.Windows.Forms;
class dummy {
    [STAThread]
    public static void Main() {
        if (Clipboard.ContainsText()) Console.Write(Clipboard.GetText());
    }
}

Hier ist ein Batch-Skript, das beide Methoden kombiniert. Wenn powershell in %PATH% vorhanden ist, verwenden Sie es. Suchen Sie andernfalls den C # -Compiler/-Linker und erstellen Sie eine temporäre .NET-Anwendung. Wie Sie in den Kommentaren des Batch-Skripts sehen können, können Sie den Inhalt der Zwischenablage mit einer for /f-Schleife erfassen oder einfach auf die Konsole übertragen.

:: 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
21
rojo

Abnehmen (auf einer ausreichend neuen Windows-Version):

set _getclip=powershell "Add-Type -Assembly PresentationCore;[Windows.Clipboard]::GetText()"
for /f "eol=; tokens=*" %I in ('%_getclip%') do set CLIPBOARD_TEXT=%I
  1. Die erste Zeile deklariert ein powershell-Commandlet.
  2. Die zweite Zeile wird ausgeführt und erfasst die Konsolenausgabe dieses Commandlets in der Umgebungsvariablen CLIPBOARD_TEXT (cmd.exe ist die am besten geeignete Methode für bash-artiges Backtick `-Capture).

Update 04.12.2017:

Vielen Dank an @Saintali, der darauf hingewiesen hat, dass PowerShell 5.0 Get-Clipboard als Cmdlets der obersten Ebene hinzufügt, sodass dies jetzt als Einzeiler funktioniert:

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

4

Der Befehl clip eignet sich gut zum Weiterleiten von Text an die Zwischenablage, kann jedoch nicht aus der Zwischenablage lesen. Es gibt eine Möglichkeit in vbscript/javascript, die Zwischenablage zu lesen/schreiben, aber sie verwendet Automatisierung und eine unsichtbare Instanz, wenn Internet Explorer es tut, also ist es ziemlich fett. 

Das beste Werkzeug, das ich für das Bearbeiten der Zwischenablage über ein Skript gefunden habe, ist das kostenlose NirCmd-Werkzeug von Nirsoft.

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

Es ist wie ein Schweizer Armeemesser mit Stapelbefehlen in einer kleinen .exe-Datei. Für Befehle in der Zwischenablage würden Sie etwas sagen

nircmd Zwischenablage [Aktion] [Parameter] 

Außerdem können Sie in jedem Befehl direkt auf den Inhalt der Zwischenablage verweisen, indem Sie die Variable $ $ $ $ $ $ $ Zwischenablage als Argument verwenden. Nircmd enthält auch Befehle, aus denen andere Programme oder Befehle ausgeführt werden können. Auf diese Weise kann der Inhalt der Zwischenablage als Argument an andere Stapelbefehle übergeben werden.

Aktionen in der Zwischenablage:

      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. 

Beachten Sie, dass die meisten Programme immer eine Nur-Text-Kopie in die Zwischenablage schreiben, selbst wenn sie eine spezielle RTF - oder HTML-Kopie in die Zwischenablage schreiben, diese jedoch als Inhalt mit einem anderen Format der Zwischenablage geschrieben werden, sodass Sie möglicherweise nicht in der Lage sind Zugriff auf diese Formate, es sei denn, Ihr Programm fordert diese Art von Daten explizit aus der Zwischenablage an.

2
klaatu

Die Ausgabe von an in die Zwischenablage wird per Clip bereitgestellt, wie andere bereits gesagt haben. Um die Eingabe von aus der Zwischenablage zu lesen, verwenden Sie das pclip-Tool in this bundle . Und da gibt es jede Menge anderes gutes Zeug.

Sie durchlaufen beispielsweise ein Online-Lernprogramm und möchten eine Datei mit dem Inhalt der Zwischenablage erstellen ...

c:\>pclip > MyNewFile.txt

oder Sie möchten einen kopierten Befehl ausführen ...

c:\>pclip | cmd
1
bbsimonbb

Da alle Antworten verwirrend sind, wird hier mein Code ohne Verzögerungen oder zusätzliche Fenster zum Öffnen des Streamlinks aus der Zwischenablage kopiert:

@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

Bei Vista oder höher ist es eingebaut. Pipe-Ausgabe an das "Clip" -Programm. . Hier ist eine Beschreibung (von mir): http://www.clipboardextender.com/general-clipboard-use/command-window-output-to-clipboard-in-Vista Der Artikel enthält auch einen Link zu einem kostenlosen Dienstprogramm (geschrieben von Me, glaube ich) namens Dos2Clip, das unter XP verwendet werden kann.

EDIT: Ich sehe, dass ich die Frage zurückbekommen habe, meine Lösung gibt die Zwischenablage aus, liest sie nicht. Es tut uns leid!

Update: Zusammen mit Dos2Clip befindet sich Clip2Dos (im selben Zip), das den Text der Zwischenablage an stdout sendet. Das sollte also für Sie funktionieren. Pascal-Quelle ist in der Zip enthalten.

1
Chris Thornton

So rufen Sie den Inhalt der Zwischenablage aus Ihrem Batch-Skript ab: Es gibt keine "reine" Batch-Lösung.

Wenn Sie eine 100% ige eingebettete Batch-Lösung wünschen, müssen Sie die andere Sprachdatei aus Ihrem Batch generieren.

Hier ist eine kurze und Batch-Embed-Lösung, die eine VB -Datei generiert (normalerweise in den meisten Fenstern installiert)

1
Jonathan

Soweit ich weiß, wird ein eigenständiges Tool namens [~ # ~] winclip [~ # ~] verwendet.

Sie können es von hier bekommen: Outwit

Verwendung:

  • Zwischenablage in Datei speichern: winclip -p file.txt
  • Kopieren Sie stdout in die Zwischenablage: winclip -c Beispiel: Sed 's/find/replace/' file | winclip -c
  • Pipe Zwischenablage zu sed: winclip -p | Sed 's/find/replace/'
  • Verwenden Sie die winclip-Ausgabe (Zwischenablage) als Argument eines anderen Befehls:

    FOR /F "tokens=* usebackq" %%G in ('winclip -p') Do (YOUR_Command %%G ) Wenn Ihre Zwischenablage mehrere Zeilen enthält, werden diese mit diesem Befehl einzeln analysiert.

Vielleicht möchten Sie sich auch getclip & putclip Tools ansehen: CygUtils für Windows aber winclip ist meiner Meinung nach besser.

0
KorkOoO

Dies ist möglicherweise nicht die genaue Antwort, aber es wird für Ihre Suche hilfreich sein.

Ursprünglicher Beitrag: Besuchen Sie https://groups.google.com/d/msg/alt.msdos.batch/0n8icUar5AM/60uEZFn9IfAJGefragt von Roger Hunt Beantwortet vonWilliam Allen


Viel sauberer Schritte:

Schritt 1) ​​Erstellen Sie mit einem beliebigen Texteditor eine "bat" -Datei mit dem Namen "Copy.bat", kopieren Sie den folgenden Code und speichern Sie ihn.

  @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=

Schritt 2) Erstellen Sie ein Leere Textdatei (in meinem Fall 'CLIP.txt' in H-Laufwerk) oder stellen Sie sicher, dass Sie den Pfad in der Copy.bat-Datei unter 'FN = H:\CLIP. txt 'mit dem Zieldateipfad.

Das ist es.

Wenn Sie also beliebigen Text von irgendwoher kopieren und die Copy.bat-Datei vom Desktop aus ausführen, werden die CLIP.txt-Datei mit dem Inhalt der Zwischenablage und speichert sie aktualisiert.

Verwendet:

Ich verwende es zum Übertragen von Daten von entfernt verbundenen Computern, auf denen Kopieren/Einfügen zwischen verschiedenen Verbindungen deaktiviert ist. wobei das gemeinsam genutzte Laufwerk (H :) für alle Verbindungen gilt.

0
Srivastav Reddy