web-dev-qa-db-fra.com

Accéder au Presse-papiers dans un fichier batch Windows

Avez-vous une idée de la façon d'accéder au presse-papiers de Windows à l'aide d'un fichier de commandes?

23
random21

Pour définir le contenu du presse-papiers, comme l'ont dit Chris Thornton, klaatu et grappes d'autres personnes , utilisez %windir%\system32\clip.exe.


Mise à jour 2:

Pour un one-liner rapide, vous pouvez faire quelque chose comme ceci:

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

Capturez et analysez avec une boucle for /F si nécessaire. Cela ne fonctionnera pas aussi rapidement que la solution JScript ci-dessous, mais cela présente l'avantage de la simplicité.


Solution mise à jour:

Merci Jonathan pour m'avoir signalé les capacités de l'objet mystérieux htmlfile COM pour la récupération du presse-papiers. Il est possible d'appeler un hybride batch + JScript pour récupérer le contenu du presse-papiers. En fait, il suffit d’une ligne JScript et d’une ligne cscript pour le déclencher, ce qui est beaucoup plus rapide que la solution PowerShell/.NET proposée précédemment.

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

Ancienne solution:

Il est possible de récupérer le texte du Presse-papiers à partir de la console Windows sans aucune application tierce en utilisant .NET. Si vous avez installé powershell, vous pouvez récupérer le contenu du presse-papiers en créant une zone de texte imaginaire et en la collant. ( La source )

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

Si vous n'avez pas powershell, vous pouvez toujours compiler une application .NET simple pour transférer le texte du presse-papiers sur la console. Voici un exemple en 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());
    }
}

Voici un script batch qui combine les deux méthodes. Si powershell existe dans %PATH%, utilisez-le. Sinon, recherchez le compilateur/lieur C # et créez une application .NET temporaire. Comme vous pouvez le constater dans les commentaires du script de traitement par lots, vous pouvez capturer le contenu du presse-papiers à l'aide d'une boucle for /f ou simplement les transférer dans la 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
21
rojo

La commande clip permet de transférer du texte dans le presse-papiers, mais elle ne peut pas être lue dans le presse-papiers. Il existe un moyen dans vbscript/javascript de lire/écrire le presse-papiers, mais il utilise l'automatisation et une instance invisible si Internet Explorer le fait pour être assez gros. 

Le meilleur outil que j'ai trouvé pour utiliser le presse-papiers à partir d'un script est l'outil gratuit NirCmd de Nirsoft.

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

Cela ressemble à un couteau suisse composé de commandes par lot regroupées dans un petit fichier .exe. Pour les commandes du presse-papiers, vous diriez quelque chose comme:

nircmd clipboard [Action] [Parameter] 

De plus, vous pouvez faire directement référence au contenu du presse-papiers dans n’importe laquelle de ses commandes en utilisant sa variable ~ $ clipboard $ comme argument. Nircmd contient également des commandes permettant d'exécuter d'autres programmes ou des commandes. Il est donc possible de l'utiliser pour transmettre le contenu du presse-papiers en tant qu'argument aux autres commandes de traitement par lots.

Actions du presse-papier:

      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. 

Notez que la plupart des programmes écrivent toujours une copie en texte brut dans le presse-papiers même lorsqu'ils écrivent une copie spéciale RTF ou HTML dans le presse-papiers. Toutefois, ceux-ci sont écrits sous forme de contenu utilisant un type de format de presse-papiers différent. pour accéder à ces formats, à moins que votre programme ne demande explicitement ce type de données au Presse-papiers.

2
klaatu

La sortie de tuyauterie to dans le presse-papiers est fournie par clip, comme d’autres l’ont dit. Pour lire l'entrée de dans le presse-papiers, utilisez l'outil pclip dans this bundle . Et il y a des tonnes d'autres bonnes choses là-dedans.

Ainsi, par exemple, vous suivez un didacticiel en ligne et vous souhaitez créer un fichier avec le contenu du presse-papiers ...

c:\>pclip > MyNewFile.txt

ou vous voulez exécuter une commande copiée ...

c:\>pclip | cmd
1
bbsimonbb

Avec Vista ou une version ultérieure, il est intégré. Il vous suffit de diriger la sortie vers le programme "clip" . Voici un résumé (de moi): http://www.clipboardextender.com/general-clipboard-use/commande-window-output-to-clipboard-in-Vista Cet article contient également un lien vers un utilitaire gratuit (écrit par Moi, appelé) appelé Dos2Clip, qui peut être utilisé sous XP.

EDIT: Je vois que j'ai la question à l'envers, ma solution OUTPUTS dans le presse-papier, ne la lit pas. Pardon!

Mise à jour: avec Dos2Clip, Clip2Dos (dans le même fichier Zip) envoie le texte du presse-papiers à la sortie standard. Donc, cela devrait fonctionner pour vous. La source Pascal est incluse dans le fichier Zip.

1
Chris Thornton

Pour récupérer le contenu du presse-papiers à partir de votre script de traitement par lots: il n’existe pas de solution de traitement par lots «pure».

Si vous souhaitez intégrer une solution 100% batch, vous devez générer l’autre fichier de langue à partir de votre lot.

Voici une solution d'intégration courte et par lots qui génère un fichier VB (généralement installé sur la plupart des fenêtres)

1
Jonathan

Ce n'est peut-être pas la réponse exacte, mais ce sera utile pour votre quête.

Message original: Visitez https://groups.google.com/d/msg/alt.msdos.batch/0n8icUar5AM/60uEZFn9IfAJInterrogé par Roger Hunt William Allen répond


Étapes beaucoup plus propres:

Étape 1) créez un fichier 'bat' nommé Copy.bat dans le bureau à l'aide de n'importe quel éditeur de texte, copiez et collez le code ci-dessous et enregistrez-le.

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

Étape 2) créer un fichier texte vide (dans mon cas, «CLIP.txt» dans H Drive) ou n’importe où, assurez-vous de mettre à jour le chemin d’accès dans le fichier Copy.bat sous «FN = H:\CLIP.txt». avec votre chemin de fichier de destination.

C'est tout.

Donc, lorsque vous copiez n’importe quel texte de n’importe où et que vous exécutez le fichier Copy.bat à partir du bureau, il met à jour le fichier CLIP.txt avec le contenu du Presse-papiers et le sauvegarde.

Les usages:

Je l'utilise pour transférer des données à partir de machines connectées à distance où le copier/coller est désactivé entre différentes connexions; où lecteur partagé (H :) est commun à toutes les connexions.

0
Srivastav Reddy