Usa appunti da VBScript

Sto cercando un metodo per inserire del testo negli Appunti con VBScript . Il VBScript in questione verrà distribuito come parte del nostro script di accesso. Vorrei evitare di utilizzare tutto ciò che non è disponibile su un sistema Windows XP pulito.

Modifica: in risposta alle domande su cosa sia questo.

Volevamo incoraggiare gli utenti all’interno della nostra organizzazione a utilizzare il file server per trasferire documenti invece di inviare continuamente allegati via e-mail. Uno dei maggiori ostacoli a questo è che non è sempre ovvio alle persone qual è il percorso di rete corretto per un file / cartella. Abbiamo sviluppato uno script rapido e lo abbiamo allegato al menu di scelta rapida di Windows in modo che un utente possa fare clic con il pulsante destro del mouse su qualsiasi file / cartella e ottenere un URL che può inviare via email a qualcuno all’interno della nostra organizzazione.

Voglio che l’URL visualizzato nella finestra di dialogo venga inserito anche negli appunti.

GetNetworkPath

Microsoft non consente a VBScript di accedere direttamente agli Appunti. Se fai una ricerca di 'clipboard' su questo sito vedrai:

Sebbene Visual Basic, Applications Edition supporti gli oggetti Screen, Printer, App, Debug, Err e Clipboard, VBScript supporta solo l’object Err. Pertanto, VBScript non ti consente di accedere a tali oggetti utili come il puntatore del mouse o gli appunti. Tuttavia, è ansible utilizzare l’object Err per fornire la gestione degli errori di runtime per le proprie applicazioni.

Quindi usare il blocco note in modo indiretto è probabilmente il migliore che si possa fare con VBScript.

Un’altra soluzione che ho trovato che non è perfetta secondo me, ma non ha fastidiosi avvisi di sicurezza è usare clip.exe da un server 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

Esempio con una stringa multilinea come da domanda in basso

 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 soluzione più vicina che ho trovato finora è un metodo per utilizzare IE per ottenere e impostare elementi negli appunti. Il problema con questa soluzione è che l’utente riceve avvisi di sicurezza. Sono tentato di spostare “about: blank” nella zona di sicurezza del computer locale in modo da non ricevere gli avvertimenti, ma non sono sicuro di quali sarebbero le implicazioni di sicurezza di ciò.

 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’utilizzo di clip.exe di Microsoft è il più vicino a una soluzione di sistema Windows XP pulita. Tuttavia non è necessario chiamare CMD.EXE per ospitarla per poterlo utilizzare. Puoi chiamarlo direttamente e scrivere nel suo stream di input nel tuo codice di script. Una volta chiuso il stream di input clip.exe, il contenuto verrà scritto direttamente negli Appunti.

 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 

Se è necessario attendere il completamento del clip prima che lo script possa continuare l’elaborazione, aggiungere

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

E non dimenticare di rilasciare i tuoi oggetti

 Set oIn = Nothing Set oExec = Nothing 

Per evitare gli avvisi di sicurezza associati a Internet Explorer e agli Appunti, ti consiglio di utilizzare l’object dell’applicazione Word e i relativi metodi per inserire i tuoi dati negli Appunti. Ovviamente è ansible utilizzarlo solo su una macchina su cui è installato MS Word, ma al giorno d’oggi è la maggior parte di questi. (* Nonostante tu abbia chiesto cose su un sistema ‘pulito’ 🙂 *)

 ' 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 

È ansible trovare i dettagli sull’object dell’applicazione MS Word e i relativi metodi qui: http://msdn.microsoft.com/en-us/library/aa221371(office.11).aspx

Ecco un’altra versione dell’utilizzo del comando “clip”, che evita di aggiungere un ritorno a capo, avanzamento riga alla fine della stringa:

 strA= "some character string" 

 Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "cmd /C echo . | set /px=" & strA & "| c:\clip.exe", 2 

 s = "String: """ & strA & """ is on the clipboard." Wscript.Echo s 

Ho provato solo questo in XP. clip.exe è stato scaricato da http://www.petri.co.il/downloads/clip.zip e inserito in C: \.

Ho trovato un modo per copiare informazioni multi linea negli appunti da vbscript / cmd.

Sequenza:

  • con VBS generare la “stringa formattata” finale che è necessario copiare negli appunti
  • generare un file (txt) con la “stringa formattata”
  • usa il comando type da cmd per incollare le informazioni in clip per pipe

Script di esempio:

 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 

Nessun avviso di sicurezza, accesso completo e accesso:

 '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 

Esempio di utilizzo.

 ' 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 

Ho escogitato un altro modo per utilizzare IE e tuttavia evitare gli avvisi di sicurezza …

A proposito … questa funzione è in JavaScript … ma puoi facilmente convertirla in 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 = ""; var oTb = oIe.document.getElementById('txtArea'); oTb.value = sTxt; oTb.select(); oTb = null; oIe.ExecWB(12,0); oIe.Quit(); oIe = null; } 

Ecco il metodo di Srikanth tradotto in 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 = "" 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 = "" 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 

Il modo più semplice è utilizzare la funzionalità mshta.exe integrata:

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

Per inserire negli appunti una stringa contenente il carattere di virgoletta doppia " , utilizzare il seguente codice:

 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 

Dai un’occhiata a questo post . Descrive un approccio hacky da leggere dagli appunti, ma immagino che possa essere adattato anche per scrivere negli appunti, come cambiare Ctrl + V in Ctrl + A e poi Ctrl + C.

Nella class ClipBoard , né il sottotitolo Clear né il sottotitolo Let Data funzionano. Voglio dire che non hanno alcun effetto su Clipboard Windows. In realtà, e per ironia della sorte, l’unico sottotitolo che funziona è quello che non hai incluso nel tuo esempio, vale a dire Ottieni dati! (Ho testato questo codice un bel po ‘di volte.)

Tuttavia, non è colpa tua. Ho provato a copiare i dati negli appunti con ClipboardData.SetData ed è imansible. Almeno non creando un object “htmlfile”. Forse funziona creando un’istanza di “InternetExplorer.Application” come ho visto in alcuni casi, ma non l’ho ancora provato. Odio creare istanze di applicazioni per compiti così semplici!

Alkis

Se è solo testo non puoi semplicemente creare un file di testo e leggere i contenuti quando ne hai bisogno?

Un’altra alternativa e chiaramente un kludge, sarebbe utilizzare il metodo SendKeys() .

Nessun avviso di sicurezza e nessun ritorno a capo alla fine della riga

 ' 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