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.

GetNetworkPath

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top