2008-09-24 62 views
16

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 el uso de cualquier cosa que no esté disponible en un sistema limpio de Windows XP.Usar el portapapeles de VBScript

Editar: Respondiendo a las preguntas sobre para qué sirve.

Queríamos alentar a los usuarios de nuestra organización a utilizar el servidor de archivos para transferir documentos en lugar de enviar adjuntos constantemente 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 un guión rápido y lo adjuntamos al menú contextual de Windows para que un usuario pueda hacer clic derecho en cualquier archivo/carpeta y obtener una URL que pueda enviar por correo electrónico a alguien de nuestra organización.

Quiero que la URL que se muestra en el cuadro de diálogo también se coloque en el portapapeles.

GetNetworkPath

+0

Por curiosidad, ¿cuál es el propósito de pu poner la información en el portapapeles? ¿Podría un archivo .txt temporal estar bien para almacenar los datos con los que está trabajando, que se eliminarán cuando haya terminado? – unrealtrip

Respuesta

4

Microsoft no permite que VBScript acceda directamente al portapapeles. Si usted hace una búsqueda de 'clipboard' en this sitio verá:

Aunque Visual Basic para Aplicaciones apoya la pantalla, impresora, App, depuración, Err, y los objetos del portapapeles, VBScript sólo admite el objeto Err. Por lo tanto, VBScript no le permite acceder a objetos útiles como el puntero del mouse o el portapapeles. Sin embargo, puede usar el objeto Err para proporcionar un manejo de errores de tiempo de ejecución para sus aplicaciones.

Así que utilizar el bloc de notas indirectamente es probablemente lo mejor que podrá hacer con VBScript.

10

La solución más cercano que he encontrado hasta ahora es un método para utilizar IE para obtener y establecer cosas en el portapapeles. El problema con esta solución es que el usuario recibe advertencias de seguridad. Estoy tentado de moverme 'en blanco' a la zona de seguridad informática local para no recibir 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

+0

http://stackoverflow.com/a/21239166/185851 muestra cómo usar IE y un archivo temporal para copiar texto en el portapapeles sin generar una advertencia emergente. – Richard

27

Otra solución que he encontrado que no es perfecto en mi opinión, pero no tiene los molestos avisos de seguridad es el uso de un servidor clip.exe 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 de varias líneas como por 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 
+2

¡Es maravilloso! ¿Pero qué hay de poner una variable multilínea en lugar de 'hola mundo'? –

+1

Acabo de marcar: el clip está disponible en Windows 7. – cup

+1

, esto fallará porque no hay forma de pasar * lotes * de caracteres en una lista de argumentos del shell CMD ... por ejemplo "http://x.com/?var1&var2" el '&' romperá esa secuencia de comandos. – gcb

6

Para evitar las advertencias de seguridad asociados con Internet Explorer y el acceso portapapeles, le recomiendo que utilice el objeto de aplicación Palabra y sus métodos para poner sus datos en el portapapeles. Por supuesto, solo puede usar esto en una máquina que tenga instalado MS Word, pero en la actualidad es la mayoría de ellos. (* A pesar del hecho de que usted 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 la aplicación MS Word y sus métodos aquí: http://msdn.microsoft.com/en-us/library/aa221371(office.11).aspx

0

Si solo se trata de 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().

5

Aquí es otra versión de usar el comando "pinza", lo que evita la adición de 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 

Solo he probado esto en XP. clip.exe se descargó de http://www.petri.co.il/downloads/clip.zip y se colocó en C: \.

3

Sin advertencias de seguridad, llena dejar y obtener acceso:

'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 
10

El uso de clip.exe de Microsoft es lo más cercano a tener una solución de sistema de Windows XP limpia. Sin embargo, no es necesario llamar a CMD.EXE para alojarlo para poder usarlo. Puede llamarlo directamente y escribir en su flujo de entrada en su código de secuencia de comandos. Una vez que cierre la secuencia de entrada, clip.exe escribirá los contenidos 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 tiene que esperar a que el clip para ser terminado antes de su script puede continuar procesando a continuación, añadir

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

Y no se olvide de liberar sus objetos

Set oIn = Nothing 
Set oExec = Nothing 
+0

Fantástica respuesta, pero poner objetos en Nothing casi siempre es inútil. http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/wow-are-you-required-to-set-objects-to-nothing.aspx – Tmdean

+0

@Tmdean no es cierto especialmente en términos de tareas de base de datos, no desea que los recursos se dejen abiertos una vez que ya no sean necesarios. De lo que Eric está hablando es del uso dentro de las funciones que tienen su propio alcance, a medida que salen del alcance los objetos serán destruidos, por lo que no es necesario desdirigirlos manualmente. – Lankymart

1

Tome una mira this post. Describe un enfoque hacky a , lea desde el portapapeles, pero imagino que podría adaptarse para también escribir en el portapapeles, como cambiar Ctrl + V a Ctrl + A y luego Ctrl + C.

2

Ideé otra forma de usar Internet Explorer y, sin embargo evitar advertencias de seguridad ...

Por cierto .. esta función está en JavaScript .. pero u puede convertir fácilmente a 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; 
} 
+0

Esto funciona, tengo mi voto. No sé por qué la gente vota esto, el único inconveniente es que se necesitan unos milisegundos para inicializar la instancia de IE ... ¡pero aparte de eso, genial! Nota para otros: Si te gusta javascript, y estás en Windows, vale la pena echarle un vistazo a jscript, en pocas palabras, es una edición de vbscript javascript. –

2

Aquí está el método de Srikanth traduce 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 
1

En su clase ClipBoard, ni el sub claro ni el trabajo sub Let datos. Quiero decir que no tienen ningún efecto en Windows Clipboard. En realidad, e irónicamente, el único submarino que funciona es el que no ha incluido en su ejemplo, ¡es Get Data! (He probado este código bastantes veces).

Sin embargo, no es su culpa. Intenté copiar datos en el portapapeles con ClipboardData.SetData y es imposible. Al menos no creando un objeto "htmlfile". Tal vez funcione creando una instancia de "InternetExplorer.Application" como he visto en algunos casos, pero no lo he intentado.¡Odio crear instancias de aplicaciones para tareas tan simples!

Alkis

4

he encontrado una manera de copiar la información de múltiples líneas en el portapapeles por VBScript/cmd.

Secuencia:

  • con VBS generar la final "cadena con formato" que necesita copiar al portapapeles
  • generar un (txt) presentar ante la "cadena con formato"
  • uso de comandos tipo de cmd para pegar la información para recortar 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 
2

La forma más sencilla es utilizar una función de mshta.exe funcionalidad:

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

Para poner al portapapeles una cadena que contiene el doble carbón cita ", utilice el código de abajo:

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 
0

Sin advertencias de seguridad y sin 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