Question

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 Windows XP propre.

Modifier: 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 souhaite que l'URL affichée dans la boîte de dialogue soit également placée dans le Presse-papiers.

GetNetworkPath

Était-ce utile?

La solution

Microsoft n'autorise pas VBScript à accéder directement au Presse-papiers. Si vous effectuez une recherche sur 'presse-papiers' sur ce 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 cependant utiliser l'objet Err pour gérer les erreurs d'exécution de vos applications.

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

Autres conseils

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

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 "approximativement: 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

L'utilisation de clip.exe de Microsoft est la solution la plus proche d'une solution système Windows XP propre. 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

' 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

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'objet d'application MS Word et ses méthodes ici: http://msdn.microsoft.com/en-us/library/aa221371 (office.11) .aspx

Voici une autre version de l’utilisation du & clip; clip " commande, ce 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é à partir de http://www.petri.co.il/downloads/clip .zip et placé dans C: \.

Aucun avertissement de sécurité, laissez entrer et obtenir 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

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 dernière "chaîne formatée" que vous avez besoin de 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 pipe

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

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

Au fait .. 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;
}

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

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

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 un caractère guillemet double " , 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

Consultez ce message . Il décrit une approche simpliste pour lire à 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.

Dans votre classe ClipBoard , ni le sous-marin Clear ni le sous-dossier Laisser les données ne fonctionnent. Je veux dire qu’ils n’ont aucun effet sur le Presse-papiers de Windows. 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 votre 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 " fichier html " objet. 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

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 () .

Aucun avertissement de sécurité et aucun retour 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top