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.
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.
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
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
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
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
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: \.
J'ai trouvé un moyen de copier des informations multilignes dans le presse-papiers avec vbscript/cmd.
Séquence:
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
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
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é 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
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;
}
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
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.
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 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