web-dev-qa-db-fra.com

Utiliser le presse-papiers de VBScript

Je cherche une méthode pour placer du texte dans le presse-papiers avec VBScript . Le VBScript en question sera déployé dans le cadre de notre script de connexion. J'aimerais éviter d'utiliser tout ce qui n'est pas disponible sur un système propre Windows XP.

Edit: En réponse aux questions sur son utilité.

Nous voulions encourager les utilisateurs de notre organisation à utiliser le serveur de fichiers pour transférer des documents au lieu d'envoyer constamment des pièces jointes par courrier électronique. L'un des principaux obstacles à cette solution est qu'il n'est pas toujours évident pour les personnes de savoir quel est le chemin d'accès réseau correct vers un fichier/dossier. Nous avons développé un script rapide et l'avons associé au menu contextuel de Windows afin qu'un utilisateur puisse cliquer avec le bouton droit de la souris sur un fichier/dossier et obtenir une URL qu'il peut envoyer par courrier électronique à une personne de notre organisation.

Je veux que l'URL affichée dans la boîte de dialogue soit également placée dans le presse-papiers.

GetNetworkPath

17
Zoredache

Microsoft ne permet pas à VBScript d'accéder directement au Presse-papiers. Si vous effectuez une recherche pour 'clipboard'on this site, vous verrez: 

Bien que Visual Basic pour Applications prenne en charge les objets Screen, Printer, App, Debug, Err et Clipboard, VBScript ne prend en charge que l'objet Err. Par conséquent, VBScript ne vous permet pas d'accéder à des objets utiles tels que le pointeur de la souris ou le Presse-papiers. Vous pouvez toutefois utiliser l'objet Err pour fournir une gestion des erreurs d'exécution pour vos applications.

Donc, utiliser indirectement le bloc-notes est probablement ce que vous pourrez faire de mieux avec VBScript.

4
tloach

Une autre solution que j'ai trouvée qui, à mon avis, n'est pas parfaite, mais qui n'a pas les avertissements de sécurité gênants, consiste à utiliser clip.exe à partir d'un serveur W2K3.

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo hello world | clip", 0, TRUE

http://www.petri.co.il/quickly_copy_error_and_display_messages.htm

Exemple avec une chaîne multiligne selon la question ci-dessous

Dim string
String = "text here" &chr(13)& "more text here"
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo " & String & " | clip", 0, TRUE
27
Zoredache

Clip.exe de Microsoft est le plus proche d'avoir une solution système propre Windows XP. Cependant, vous n'avez pas besoin d'appeler CMD.EXE pour l'héberger afin de l'utiliser. Vous pouvez l'appeler directement et écrire dans son flux d'entrée dans votre code de script. Une fois que vous fermez le flux d'entrée, clip.exe écrit le contenu directement dans le presse-papiers.

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("clip")
Set oIn = oExec.stdIn
oIn.WriteLine "Something One"
oIn.WriteLine "Something Two"
oIn.WriteLine "Something Three"
oIn.Close

Si vous devez attendre que le clip soit terminé avant que votre script puisse continuer le traitement, ajoutez-le.

' loop until we're finished working.
Do While oExec.Status = 0
    WScript.Sleep 100
Loop

Et n'oubliez pas de libérer vos objets

Set oIn = Nothing
Set oExec = Nothing
10
klaatu

La solution la plus proche que j'ai trouvée jusqu'à présent est une méthode permettant d'utiliser IE pour obtenir et définir des éléments dans le presse-papiers. Le problème avec cette solution est que l'utilisateur reçoit des avertissements de sécurité. Je suis tenté de me déplacer «en blanc» dans la zone de sécurité de l'ordinateur local afin de ne pas recevoir les avertissements, mais je ne suis pas sûr de ce que cela impliquerait pour la sécurité.

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", "Hello This Is A Test"
objIE.Quit

http://www.Microsoft.com/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx

10
Zoredache

Pour éviter les avertissements de sécurité associés à Internet Explorer et à l'accès au Presse-papiers, je vous recommande d'utiliser l'objet d'application Word et ses méthodes pour placer vos données dans le Presse-papiers. Bien sûr, vous ne pouvez l’utiliser que sur une machine sur laquelle MS Word est installé, mais de nos jours, c’est la plupart d’entre eux. (* Bien que vous ayez demandé des choses sur un système «propre» :) *)

' Set what you want to put in the clipboard '
strMessage = "Imagine that, it works!"

' Declare an object for the Word application '
Set objWord = CreateObject("Word.Application")

' Using the object '
With objWord
   .Visible = False         ' Don't show Word '
   .Documents.Add           ' Create a document '
   .Selection.TypeText strMessage   ' Put text into it '
   .Selection.WholeStory        ' Select everything in the doc '
   .Selection.Copy          ' Copy contents to clipboard '
   .Quit False          ' Close Word, don't save ' 
End With

Vous trouverez des détails sur l’application MS Word et ses méthodes ici: http://msdn.Microsoft.com/en-us/library/aa221371(office.11).aspx

6
unrealtrip

Voici une autre version de l’utilisation de la commande "clip", qui évite d’ajouter un retour chariot, un saut de ligne à la fin de la chaîne:

strA= "some character string"

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd /C echo . | set /p x=" & strA & "| c:\clip.exe", 2

s = "String: """ & strA & """ is on the clipboard."
Wscript.Echo s

Je n'ai testé cela que sous XP. clip.exe a été téléchargé de http://www.petri.co.il/downloads/clip.Zip et placé dans C: \.

5
Peter Talbot

J'ai trouvé un moyen de copier des informations multilignes dans le presse-papiers avec vbscript/cmd.

Séquence:

  • avec VBS, générez la "chaîne formatée" finale que vous devez copier dans le presse-papier
  • générer un fichier (txt) avec la "chaîne formatée"
  • utilisez la commande type de cmd pour coller les informations à découper par canal

Exemple de script:

Function CopyToClipboard( sInputString )

    Dim oShell: Set oShell = CreateObject("WScript.Shell")
    Dim sTempFolder: sTempFolder = oShell.ExpandEnvironmentStrings("%TEMP%")
    Dim sFullFilePath: sFullFilePath = sTempFolder & "\" & "temp_file.txt"

    Const iForWriting = 2, bCreateFile = True
    Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
    With oFSO.OpenTextFile(sFullFilePath, iForWriting, bCreateFile)
        .Write sInputString
        .Close
    End With

    Const iHideWindow = 0, bWaitOnReturnTrue = True
    Dim sCommand: sCommand = "CMD /C TYPE " & sFullFilePath & "|CLIP"
    oShell.Run sCommand, iHideWindow, bWaitOnReturnTrue

    Set oShell = Nothing
    Set oFSO = Nothing

End Function

Sub Main

    Call CopyToClipboard( "Text1" & vbNewLine & "Text2" )

End Sub

Call Main
4
n3rd4i

Aucun avertissement de sécurité, laissez-le et obtenez l'accès:

'create a clipboard thing
 Dim ClipBoard
 Set Clipboard = New cClipBoard

 ClipBoard.Clear  
 ClipBoard.Data = "Test"

Class cClipBoard
        Private objHTML

                Private Sub Class_Initialize
                        Set objHTML = CreateObject("htmlfile")
                End Sub

                Public Sub Clear()
                        objHTML.ParentWindow.ClipboardData.ClearData()
                End Sub

                Public Property Let Data(Value)
                        objHTML.ParentWindow.ClipboardData.SetData "Text" , Value
                End Property

                Public Property Get Data()
                        Data = objHTML.ParentWindow.ClipboardData.GetData("Text")
                End Property

                Private Sub Class_Terminate
                        Set objHTML = Nothing
                End Sub

End Class

Exemple d'utilisation.

' Create scripting object
Dim WShell, lRunUninstall
Set WShell = CreateObject("WScript.Shell")
WShell.sendkeys "^c"
WScript.Sleep 250
bWindowFound = WShell.AppActivate("Microsoft Excel")
 WShell.sendkeys ClipBoard.Data
4
swyx

Voici la méthode de Srikanth traduite en vbs

function SetClipBoard(sTxt)
    Set oIe = WScript.CreateObject("InternetExplorer.Application")
    oIe.silent = true
    oIe.Navigate("about:blank")
    do while oIe.ReadyState <> 4
        WScript.Sleep 20
    loop

    do while oIe.document.readyState <> "complete"
        WScript.Sleep 20
    loop

    oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>"
    set oTb = oIe.document.getElementById("txtArea")
    oTb.value = sTxt
    oTb.select
    set oTb = nothing
    oIe.ExecWB 12,0
    oIe.Quit
    Set oIe = nothing
End function


function GetClipBoard()
    set oIe = WScript.CreateObject("InternetExplorer.Application")
    oIe.silent = true
    oIe.Navigate("about:blank")
    do while oIe.ReadyState <> 4
        WScript.Sleep 20
    loop

    do while oIe.document.readyState <> "complete"
        WScript.Sleep 20
    loop 

    oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>"
    set oTb = oIe.document.getElementById("txtArea")
    oTb.focus   
    oIe.ExecWB 13,0
    GetClipBoard = oTb.value
    oTb.select
    set oTb = nothing
    oIe.Quit
    Set oIe = nothing
End function
2
Nive Auverleih

Le moyen le plus simple consiste à utiliser la fonctionnalité intégrée mshta.exe:

sText = "Text Content"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(sText, "\", "\\"), "'", "\'") & "');close();""", 0, True

Pour insérer dans le presse-papiers une chaîne contenant des guillemets doubles, le code ", utilisez le code ci-dessous:

sText = "Text Content and double quote "" char"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(Replace(sText, "\", "\\"), """", """"""), "'", "\'") & "'.replace('""""',String.fromCharCode(34)));close();""", 0, True
2
omegastripes

J'ai mis au point un autre moyen d'utiliser IE tout en évitant les avertissements de sécurité ...

À propos .. cette fonction est en JavaScript .. mais vous pouvez facilement la convertir en VBScript ..

function CopyText(sTxt) {
    var oIe = WScript.CreateObject('InternetExplorer.Application');
    oIe.silent = true;
    oIe.Navigate('about:blank');
    while(oIe.ReadyState!=4) WScript.Sleep(20);
    while(oIe.document.readyState!='complete') WSript.Sleep(20);
    oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>";
    var oTb = oIe.document.getElementById('txtArea');
    oTb.value = sTxt;
    oTb.select();
    oTb = null;
    oIe.ExecWB(12,0);
    oIe.Quit();
    oIe = null;
}
2
Srikanth P

Dans votre classe ClipBoard, ni le sous-marin Clear ni le sous-dossier Let Data ne fonctionnent. Je veux dire qu'ils n'ont aucun effet sur Windows Clipboard. En réalité, et ironiquement, le seul sous-programme qui fonctionne est celui que vous n'avez pas inclus dans votre exemple, à savoir Get Data! (J'ai testé ce code plusieurs fois.)

Cependant, ce n'est pas ta faute. J'ai essayé de copier des données dans le presse-papier avec ClipboardData.SetData et c'est impossible. Du moins pas en créant un objet "htmlfile". Peut-être que cela fonctionne en créant une instance de "InternetExplorer.Application" comme je l'ai vu dans quelques cas, mais je ne l'ai pas essayé. Je déteste créer des instances d'application pour des tâches aussi simples!

Alkis

1
Alkis

Jetez un oeil à ce post . Il décrit une approche simpliste de read à partir du presse-papiers, mais j’imagine qu’il pourrait être adapté pour écrire également dans le presse-papiers, par exemple en modifiant Ctrl + V en Ctrl + A puis Ctrl + C.

1
GreenGiant

S'il ne s'agit que de texte, ne pouvez-vous pas simplement créer un fichier texte et en lire le contenu lorsque vous en avez besoin? 

Une autre alternative et clairement un problème, consisterait à utiliser la méthode SendKeys().

0
Jeffery Hicks

Aucun avertissement de sécurité et aucun retour de chariot en fin de ligne

' value to put in Clipboard
mavaleur = "YEAH"

' current Dir
path = WScript.ScriptFullName
GetPath = Left(path, InStrRev(path, "\"))

' Put the value in a file
Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile=GetPath & "fichier.valeur"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write mavaleur
objFile.Close

' Put the file in the Clipboard
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c clip < " & outFile, 0, TRUE

' Erase the file
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile outFile
0
cmoiquoi