Usa gli appunti di VBScript
-
02-07-2019 - |
Domanda
Sto cercando un metodo per posizionare 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 serve.
Volevamo incoraggiare gli utenti all'interno della nostra organizzazione a utilizzare il file server per trasferire documenti invece di inviare costantemente allegati via e-mail. Uno dei maggiori ostacoli a questo è che non è sempre ovvio per le persone quale sia il percorso di rete corretto per un file / cartella. Abbiamo sviluppato uno script rapido e l'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 tramite e-mail a qualcuno all'interno della nostra organizzazione.
Voglio che anche l'URL visualizzato nella finestra di dialogo venga inserito negli Appunti.
Soluzione
Microsoft non consente a VBScript di accedere direttamente agli Appunti. Se esegui una ricerca per 'appunti'
su questo sito vedrai:
Sebbene Visual Basic, Applications Edition supporti gli oggetti Screen, Printer, App, Debug, Err e Clipboard, VBScript supporta solo l'oggetto Err. Pertanto, VBScript non consente di accedere a oggetti utili come il puntatore del mouse o gli Appunti. Tuttavia, puoi utilizzare l'oggetto Err per fornire la gestione degli errori di runtime per le tue applicazioni.
Quindi usare indirettamente il blocco note è probabilmente il meglio che sarai in grado di fare solo con VBScript.
Altri suggerimenti
Un'altra soluzione che ho trovato non è perfetta secondo me, ma non ha i 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 sotto
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 spostarmi "in giro: vuoto" nell'area di sicurezza del computer locale in modo da non ricevere gli avvisi, 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 / risorse / Qanda / dec04 / hey1215.mspx
L'uso della clip.exe di Microsoft è il più vicino ad avere una soluzione di sistema Windows XP pulita. Tuttavia non è necessario chiamare CMD.EXE per ospitarlo per poterlo utilizzare. Puoi chiamarlo direttamente e scrivere nel suo flusso di input nel tuo codice di script. Una volta chiuso l'input stream clip.exe scriverà il contenuto 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 devi attendere il completamento della clip prima che lo script possa continuare l'elaborazione, aggiungi
' 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 l'accesso agli Appunti, ti consiglio di usare l'oggetto dell'applicazione Word e i suoi metodi per inserire i tuoi dati negli Appunti. Ovviamente puoi usarlo solo su una macchina su cui è installato MS Word, ma oggigiorno è la maggior parte di essi. (* Nonostante il fatto che 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
Puoi trovare dettagli sull'oggetto applicazione MS Word e i suoi metodi qui: http://msdn.microsoft.com/en-us/library/aa221371 (office.11) aspx
Ecco un'altra versione dell'uso del " clip " comando, che evita l'aggiunta di 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 /p x=" & strA & "| c:\clip.exe", 2
s = "String: """ & strA & """ is on the clipboard."
Wscript.Echo s
L'ho provato solo in XP. clip.exe è stato scaricato da http://www.petri.co.il/downloads/clip .zip e collocato in C: \.
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 trovato un modo per copiare le informazioni su più righe negli appunti tramite vbscript / cmd.
Sequenza:
- con VBS genera la stringa finale "quotata" " che devi copiare negli appunti
- genera un file (txt) con la stringa formattata "
- usa il comando type da cmd per incollare le informazioni da tagliare per pipe
Esempio di 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
Ho escogitato un altro modo per utilizzare IE ed 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 = "<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;
}
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 = "<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
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 mettere negli appunti una stringa contenente la virgoletta doppia "
, usa 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 caotico per leggere dagli appunti, ma immagino che possa essere adattato per scrivere anche negli appunti, come cambiare Ctrl + V in Ctrl + A e poi Ctrl + C.
Nella tua classe ClipBoard
, né il sottotitolo Clear né il sottotitolo Let Data funzionano. Voglio dire, non hanno alcun effetto sugli Appunti
di Windows. In realtà, e ironicamente, l'unico sub che funziona è quello che non hai incluso nel tuo esempio, ovvero Get Data! (Ho provato questo codice parecchie volte.)
Tuttavia, non è colpa tua. Ho provato a copiare i dati negli Appunti con ClipboardData.SetData ed è impossibile. Almeno non creando un " htmlfile " oggetto. Forse funziona creando un'istanza di " InternetExplorer.Application " come ho visto in alcuni casi, ma non l'ho provato. Odio creare istanze di applicazioni per compiti così semplici!
Alkis
Se è solo testo non puoi semplicemente creare un file di testo e leggere il contenuto quando ne hai bisogno?
Un'altra alternativa e chiaramente un kludge sarebbe quella di 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