20

VBScriptを使用してテキストをクリップボードに配置する方法を探しています。問題の VBScript は、ログイン スクリプトの一部として展開されます。クリーンな Windows XP システムで利用できないものは使用したくありません。

編集: これが何のためにあるのかについての質問への答え。

私たちは、組織内のユーザーが電子メールで添付ファイルを常に送信するのではなく、ファイル サーバーを使用してドキュメントを転送することを奨励したいと考えていました。これに対する最大の障壁の 1 つは、ファイル/フォルダーへの正しいネットワーク パスが何であるかが常に明らかであるとは限らないことです。簡単なスクリプトを作成し、それを Windows コンテキスト メニューに添付して、ユーザーが任意のファイル/フォルダーを右クリックし、組織内の誰かに電子メールで送信できる URL を取得できるようにしました。

ダイアログボックスに表示されるURLもクリップボードに配置したい。

GetNetworkPath

4

15 に答える 15

29

私の意見では完璧ではないが、厄介なセキュリティ警告がないことがわかった別の解決策は、w2k3サーバーからclip.exeを使用することです。

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo hello world | clip", 0, TRUE

以下の質問による複数行の文字列の例: Link1

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
于 2008-09-26T00:17:45.237 に答える
13

Microsoft の clip.exe を使用するのが、クリーンな Windows XP システム ソリューションに最も近い方法です。ただし、それを使用するために CMD.EXE を呼び出してホストする必要はありません。これを直接呼び出して、スクリプト コードで入力ストリームに書き込むことができます。入力ストリームを閉じると、clip.exe は内容を直接クリップボードに書き込みます。

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

スクリプトが処理を続行する前にクリップが終了するのを待つ必要がある場合は、追加します

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

オブジェクトを解放することを忘れないでください

Set oIn = Nothing
Set oExec = Nothing
于 2012-05-15T23:18:20.987 に答える
10

これまでに見つけた最も近い解決策は、IE を使用してクリップボードにあるものを取得および設定する方法です。このソリューションの問題は、ユーザーがセキュリティ警告を受け取ることです。「about:blank」をローカル コンピューターのセキュリティ ゾーンに移動して、警告が表示されないようにしたいと考えていますが、それがセキュリティにどのような影響を与えるかはわかりません。

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

于 2008-09-24T17:23:14.617 に答える
7

Internet Explorer とクリップボード アクセスに関連するセキュリティ警告を回避するには、Word アプリケーション オブジェクトとそのメソッドを使用して、データをクリップボードに入れることをお勧めします。もちろん、これは MS Word がインストールされているマシンでのみ使用できますが、最近ではそれがほとんどです。(*あなたが「クリーンな」システムで何かを要求したという事実にもかかわらず:) *)

' 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

MS Word アプリケーション オブジェクトとそのメソッドの詳細については、http: //msdn.microsoft.com/en-us/library/aa221371 (office.11​​).aspx を参照してください。

于 2008-09-26T17:27:08.653 に答える
6

セキュリティ警告なし、完全な許可とアクセスの取得:

'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

使用例。

' 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
于 2011-12-19T17:32:22.320 に答える
5

Microsoftは、VBScriptがクリップボードに直接アクセスする方法を提供していません。このサイトで検索すると、次のように表示'clipboard'されます。

Visual Basic for Applicationsは、Screen、Printer、App、Debug、Err、およびClipboardオブジェクトをサポートしていますが、VBScriptはErrオブジェクトのみをサポートしています。したがって、VBScriptでは、マウスポインタやクリップボードなどの便利なオブジェクトにアクセスできません。ただし、Errオブジェクトを使用して、アプリケーションにランタイムエラー処理を提供することはできます。

したがって、メモ帳を間接的に使用することは、おそらくVBScriptだけで実行できる最善の方法です。

于 2008-10-06T15:19:53.413 に答える
5

「clip」コマンドを使用する別のバージョンを次に示します。これは、文字列の末尾にキャリッジ リターンやライン フィードを追加することを回避します。

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

これはXPでのみテストしました。clip.exe はLinkからダウンロードされ、 に配置されましたC:\

于 2011-05-19T14:59:13.410 に答える
4

複数行の情報を vbscript/cmd でクリップボードにコピーする方法を見つけました。

順序:

  • VBS を使用すると、クリップボードにコピーする必要がある最終的な「フォーマットされた文字列」が生成されます
  • 「フォーマットされた文字列」で(txt)ファイルを生成します
  • cmd の type コマンドを使用して情報を貼り付け、パイプでクリップする

スクリプト例:

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
于 2014-12-18T08:07:56.233 に答える
3

最も簡単な方法は、組み込みmshta.exe機能を使用することです。

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

二重引用符 char を含む文字列をクリップボードに入れるに"は、次のコードを使用します。

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
于 2016-05-02T20:38:54.607 に答える
2

vbs に変換された Srikanth のメソッドを次に示します。

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
于 2013-10-10T13:35:51.933 に答える
2

IE を使用してセキュリティ警告を回避する別の方法を考案しました...

ところで、この関数は JavaScript で書かれていますが、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;
}
于 2013-04-25T13:51:59.170 に答える
1

あなたの ClassClipBoardでは、 Clear サブも Let Data サブも機能しません。つまり、 Windows には影響しませんClipboard。実際、そして皮肉なことに、機能する唯一のサブは、例に含まれていないもの、つまり Get Data! です。(私はこのコードを何度もテストしました。)

しかし、それはあなたのせいではありません。ClipboardData.SetData を使用してデータをクリップボードにコピーしようとしましたが、不可能です。少なくとも「htmlfile」オブジェクトを作成することによってではありません。いくつかのケースで見たように、「InternetExplorer.Application」のインスタンスを作成することで機能するかもしれませんが、試したことはありません。このような単純なタスクのためにアプリケーション インスタンスを作成するのは嫌いです。

アルキス

于 2014-09-10T12:48:35.930 に答える
1

この投稿を見てください。クリップボードから読み取るハックなアプローチについて説明していますが、Ctrl+V を Ctrl+A に変更してから Ctrl+C に変更するなど、クリップボードへの書き込みにも適用できると思います。

于 2012-12-03T16:34:28.270 に答える
0

テキストだけの場合は、テキストファイルを作成して、必要なときに内容を読み込むだけではいけませんか?

別の代替手段であり、明らかに応急修理は、このSendKeys()方法を使用することです。

于 2008-10-06T15:23:38.850 に答える