VBScript からクリップボードを使用する
-
02-07-2019 - |
質問
テキストをクリップボードに配置する方法を探しています VBスクリプト. 。問題の VBScript は、ログイン スクリプトの一部としてデプロイされます。クリーンな Windows XP システムで利用できないものは使用しないようにしたいと考えています。
編集:これは何のためにあるのかという質問に答えます。
私たちは、組織内のユーザーに、常に電子メールで添付ファイルを送信するのではなく、ファイル サーバーを使用してドキュメントを転送することを推奨したいと考えました。これに対する最大の障壁の 1 つは、ファイル/フォルダーへの正しいネットワーク パスが人々にとって必ずしも明らかではないことです。私たちは簡単なスクリプトを開発し、それを Windows コンテキスト メニューに追加しました。これにより、ユーザーは任意のファイル/フォルダーを右クリックして、組織内の誰かに電子メールで送信できる URL を取得できるようになります。
ダイアログボックスに表示されたURLもクリップボードに配置したいと考えています。
解決
Microsoft は、VBScript がクリップボードに直接アクセスする方法を提供していません。で検索すると 'clipboard'
の上 これ 次のサイトが表示されます:
Visual Basic for Applications は Screen、Printer、App、Debug、Err、および Clipboard オブジェクトをサポートしますが、VBScript は Err オブジェクトのみをサポートします。したがって、VBScript では、マウス ポインタやクリップボードなどの便利なオブジェクトにアクセスすることはできません。ただし、Err オブジェクトを使用して、アプリケーションに実行時エラー処理を提供することはできます。
したがって、メモ帳を間接的に使用するのが、おそらく VBScript だけでできる最善の方法です。
他のヒント
私の考えでは完璧ではありませんが、迷惑なセキュリティ警告が表示されない別の解決策は、w2k3 サーバーからの Clip.exe を使用することです。
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
以下の質問にある複数行の文字列の例
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
私がこれまでに見つけた最も近い解決策は、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
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
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
これは、「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 は次からダウンロードされました http://www.petri.co.il/downloads/clip.zip そして C:\ に配置されます。
セキュリティ警告はありません。完全に let および get アクセスできます。
'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
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
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;
}
Srikanth のメソッドを 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
最も簡単な方法は組み込みを使用することです mshta.exe
機能:
sText = "Text Content"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(sText, "\", "\\"), "'", "\'") & "');close();""", 0, True
二重引用符を含む文字列をクリップボードに置くには "
, 、以下のコードを使用します。
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
を見てみましょう この郵便受け. 。以下に対するハックなアプローチについて説明しています。 読む クリップボードからの書き込みですが、Ctrl+V を Ctrl+A に変更し、次に Ctrl+C に変更するなど、クリップボードにも書き込むことができると思います。
あなたのクラスで ClipBoard
, 、Clear サブも Let Data サブも機能しません。つまり、Windows には影響がありません Clipboard
. 。実際、そして皮肉なことに、機能する唯一のサブは、例に含めていないもの、つまり Get Data です。(私はこのコードを何度もテストしました。)
ただし、それはあなたのせいではありません。ClipboardData.SetDataを使用してデータをクリップボードにコピーしようとしましたが、不可能です。少なくとも「htmlfile」オブジェクトを作成することによってはできません。おそらく、いくつかのケースで見たように、「InternetExplorer.Application」のインスタンスを作成することで機能するかもしれませんが、私は試していません。このような単純なタスクのためにアプリケーション インスタンスを作成するのは嫌いです。
アルキス
単なるテキストであれば、テキスト ファイルを作成し、必要なときにその内容を読み込むことはできませんか?
別の代替案ですが、明らかに面倒な方法は、 SendKeys()
方法。
セキュリティ警告なし、行末の改行なし
' 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