Usa el portapapeles de VBScript
-
02-07-2019 - |
Pregunta
Estoy buscando un método para colocar texto en el portapapeles con VBScript . El VBScript en cuestión se implementará como parte de nuestro script de inicio de sesión. Me gustaría evitar usar cualquier cosa que no esté disponible en un sistema Windows XP limpio.
Editar: En respuesta a las preguntas sobre para qué sirve esto.
Queríamos animar a los usuarios dentro de nuestra organización a usar el servidor de archivos para transferir documentos en lugar de enviar constantemente archivos adjuntos por correo electrónico. Una de las mayores barreras para esto es que no siempre es obvio para las personas cuál es la ruta de red correcta para un archivo / carpeta. Desarrollamos una secuencia de comandos rápida y la adjuntamos al menú contextual de Windows para que el usuario pueda hacer clic derecho en cualquier archivo / carpeta y obtener una URL que pueda enviar por correo electrónico a alguien dentro de nuestra organización.
Quiero que la URL que se muestra en el cuadro de diálogo también se coloque en el portapapeles.
Solución
Microsoft no permite que VBScript acceda directamente al portapapeles. Si realiza una búsqueda de 'portapapeles'
en este sitio que verá:
Aunque Visual Basic para aplicaciones admite los objetos Screen, Printer, App, Debug, Err y Clipboard, VBScript solo admite el objeto Err. Por lo tanto, VBScript no le permite acceder a objetos tan útiles como el puntero del mouse o el portapapeles. Sin embargo, puede usar el objeto Err para proporcionar manejo de errores en tiempo de ejecución para sus aplicaciones.
Por lo tanto, usar el bloc de notas indirectamente es probablemente lo mejor que puedes hacer con solo VBScript.
Otros consejos
Otra solución que he encontrado que no es perfecta en mi opinión, pero no tiene las molestas advertencias de seguridad es usar clip.exe desde un servidor 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
Ejemplo con una cadena multilínea según la pregunta a continuación
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 solución más cercana que he encontrado hasta ahora es un método para usar IE para obtener y configurar cosas en el portapapeles. El problema con esta solución es que el usuario recibe advertencias de seguridad. Tengo la tentación de mover 'about: blank' a la zona de seguridad informática local, por lo que no recibo las advertencias, pero no estoy seguro de cuáles serían las implicaciones de seguridad de eso.
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
El uso de clip.exe de Microsoft es lo más parecido a tener una solución de sistema Windows XP limpia. Sin embargo, no tiene que llamar a CMD.EXE para alojarlo para poder usarlo. Puede llamarlo directamente y escribir en su flujo de entrada en su código de script. Una vez que cierre la secuencia de entrada, el clip.exe escribirá el contenido directamente en el portapapeles.
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 necesita esperar a que finalice el clip antes de que su script pueda continuar procesándose, a continuación, agregue
' loop until we're finished working.
Do While oExec.Status = 0
WScript.Sleep 100
Loop
Y no olvides liberar tus objetos
Set oIn = Nothing
Set oExec = Nothing
Para evitar las advertencias de seguridad asociadas con Internet Explorer y el acceso al portapapeles, le recomendaría que utilice el objeto de aplicación de Word y sus métodos para colocar sus datos en el portapapeles. Por supuesto, solo puede usar esto en una máquina que tenga MS Word instalado, pero en estos días es la mayoría de ellos. (* A pesar del hecho de que pidió cosas en un sistema 'limpio' :) *)
' 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
Puede encontrar detalles sobre el objeto de aplicación de MS Word y sus métodos aquí: http://msdn.microsoft.com/en-us/library/aa221371 (office.11) .aspx
Aquí hay otra versión de usar el " clip " comando, que evita agregar un retorno de carro, avance de línea al final de la cadena:
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
Sólo he probado esto en XP. clip.exe se descargó de http://www.petri.co.il/downloads/clip .zip y colocado en C: \.
No hay advertencias de seguridad, deje y obtenga acceso completo:
'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
Ejemplo de uso.
' 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
He encontrado una forma de copiar información de varias líneas en el portapapeles mediante vbscript / cmd.
Secuencia:
- con VBS genere la cadena de formato final " " " que necesitas copiar al portapapeles
- generar un archivo (txt) con la " cadena con formato "
- use el comando de tipo de cmd para pegar la información y cortarla por tubería
Ejemplo 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
He ideado otra forma de usar IE y, sin embargo, evitar las advertencias de seguridad ...
Por cierto ... esta función está en JavaScript ... pero puedes convertirla fácilmente 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;
}
Aquí está el método de Srikanth traducido a 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
La forma más fácil es usar la funcionalidad integrada mshta.exe
:
sText = "Text Content"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(sText, "\", "\\"), "'", "\'") & "');close();""", 0, True
Para colocar en el portapapeles una cadena que contenga comillas dobles "
, use el siguiente código:
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
Echa un vistazo a esta publicación . Describe un enfoque intrépido para leer desde el portapapeles, pero me imagino que también podría adaptarse para escribir en el portapapeles, como cambiar Ctrl + V a Ctrl + A y luego Ctrl + C.
En su ClipBoard
de Clase, ni el subcomité Clear ni el sub Data Let funcionan. Quiero decir que no tienen efecto en el Portapapeles
de Windows. En realidad, e irónicamente, el único subgrupo que funciona es el que no ha incluido en su ejemplo, ¡es Obtener datos! (He probado este código varias veces).
Sin embargo, no es tu culpa. He intentado copiar datos en el portapapeles con ClipboardData.SetData y es imposible. Al menos no creando un " archivo html " objeto. Tal vez funcione creando una instancia de " InternetExplorer.Application " Como he visto en algunos casos, pero no lo he probado. ¡Odio crear instancias de aplicaciones para tareas tan simples!
Alkis
Si solo es texto, ¿no puede simplemente crear un archivo de texto y leer el contenido cuando lo necesite?
Otra alternativa y claramente un kludge, sería utilizar el método SendKeys ()
.
No hay advertencias de seguridad ni retorno de carro al final de la línea
' 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