Utiliser le presse-papiers de VBScript
-
02-07-2019 - |
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.
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