Pergunta

Eu estou procurando um método para colocar algum texto na área de transferência com VBScript . O VBScript em questão será implantado como parte do nosso script de login. Eu gostaria de evitar o uso de qualquer coisa que não está disponível em um sistema limpo do Windows XP.

Editar: Em resposta às perguntas sobre o que é isso para.

Queríamos incentivar os usuários dentro da nossa organização para usar o servidor de arquivos para transferir documentos em vez de anexos constantemente a enviar por e-mail. Uma das maiores barreiras para isso é que nem sempre é óbvio para as pessoas que o caminho de rede correta é um arquivo / pasta. Nós desenvolvemos um script rápido, e acompanha-lo ao menu de contexto do Windows para que um usuário pode clicar em qualquer arquivo / pasta, e obter uma URL que eles podem enviar e-mail para alguém dentro da nossa organização.

Eu quero a URL exibida na caixa de diálogo para também ser colocado na área de transferência.

GetNetworkPath

Foi útil?

Solução

Microsoft não dá um caminho para VBScript para acessar diretamente a área de transferência. Se você fizer uma pesquisa para 'clipboard'on este site você verá:

Apesar do Visual Basic for Applications suporta a tela, impressora App, Debug, objetos Err, e prancheta, VBScript suporta apenas o objeto Err. Portanto, VBScript não permite-lhe aceder a tais objetos úteis como o ponteiro do mouse ou a área de transferência. Você pode, no entanto, usar o objeto Err para fornecer tratamento de erros de tempo de execução para suas aplicações.

Então, usando o bloco de notas indiretamente é provavelmente o melhor que você vai ser capaz de fazer com apenas VBScript.

Outras dicas

Outra solução que eu descobri que não é perfeito em minha opinião, mas não tem os avisos de segurança irritantes é usar clip.exe de um 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

Exemplo com uma cadeia de linhas múltiplas como por questão abaixo

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

A solução mais próximo que eu encontrei até agora é um método de usar IE para obter e coisas conjunto na área de transferência. O problema com esta solução é que o usuário recebe avisos de segurança. Estou tentado a mover 'about: blank'. Para a zona de segurança do computador local para que eu não obter os avisos, mas eu não sei o que as implicações de que a segurança seria

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 / recursos / QandA / dec04 / hey1215.mspx

Usando clip.exe da Microsoft é o mais próximo de ter uma solução de sistema limpa do Windows XP. No entanto, você não tem que chamar CMD.EXE para hospedá-lo, a fim de usá-lo. Você pode chamá-lo e escrever diretamente ao seu fluxo de entrada no seu código de script. Depois de fechar o clip.exe fluxo de entrada vai escrever o conteúdo diretamente para a área de transferência.

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 você precisa esperar por clipe para ser concluída antes de seu script pode continuar processando em seguida, adicione

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

E não se esqueça de liberar seus objetos

Set oIn = Nothing
Set oExec = Nothing

Para evitar os avisos de segurança associados com o Internet Explorer e acesso prancheta, eu recomendo que você use o objeto aplicativo Word e seus métodos para colocar os seus dados na área de transferência. Claro que você só pode usar isso em uma máquina que tem o MS Word instalado, mas estes dias que é a maioria deles. (* Apesar do fato de que você pediu para o material em um sistema 'limpo' :) *)

' 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

Você pode encontrar detalhes sobre o objeto do aplicativo MS Word e seus métodos aqui: http://msdn.microsoft.com/en-us/library/aa221371 (office.11) .aspx

Aqui está uma outra versão de usar o comando "clipe", o que evita a adição de um retorno de carro, alimentação de linha ao final da string:

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

Eu só testei isso no XP. clip.exe foi baixado http://www.petri.co.il/downloads/clip zip e colocado em C:. \

avisos de segurança Não, deixe completo e acesso obter:

'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

Exemplo 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

Eu encontrei uma maneira de copiar informações de multi linha para área de transferência vbscript / cmd.

Sequência:

  • com VBS gerar o "string formatado" final que você precisa copiar para área de transferência
  • gerar um arquivo (txt) com o "string formatado"
  • uso tipo de comando de cmd para colar informações para cortar pela tubulação

Exemplo 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

eu criei uma outra maneira de usar o IE e ainda avisos de segurança Evitar ...

A propósito .. esta função está em JavaScript .. mas u pode facilmente convertê-lo em 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;
}

Aqui está o método de Srikanth traduzido em 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

A maneira mais fácil é usar built-in funcionalidade mshta.exe:

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

Para colocar à prancheta uma string contendo dupla " Citação char, usar o código abaixo:

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

Dê uma olhada este post . Ele descreve uma abordagem hacky para ler da área de transferência, mas eu imagino que poderia ser adaptada para também escrever para a área de transferência, bem como, como a alteração do Ctrl + V para Ctrl + A, em seguida, Ctrl + C.

Em seu ClipBoard Class, nem o claro sub nem o sub trabalho Let Data. Quero dizer que eles não têm nenhum efeito no Windows Clipboard. Na verdade, e, ironicamente, por isso, a única sub que funciona é o que você não tenha incluído no seu exemplo, que é obter dados! (Eu testei este código algumas vezes.)

No entanto, não é sua culpa. Eu tentei copiar dados para prancheta com ClipboardData.SetData e é impossível. Pelo menos não através da criação de um objeto "htmlfile". Talvez ele funciona através da criação de uma instância de "InternetExplorer.Application" como eu já vi em alguns casos, mas eu não tentei. Eu odeio a criação de instâncias de aplicações para tais tarefas simples!

Alkis

Se é apenas o texto que você não pode simplesmente criar um arquivo de texto e ler o conteúdo quando você precisar dele?

Outra alternativa e claramente um truque, seria usar o método SendKeys().

avisos de segurança não e não retorno de carro no final da linha

' 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top