VBScriptでクリップボードに送る
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

VBScriptでクリップボードに送る

2016-09-25 01:09

    VBScriptでクリップボードに文字列を送る方法の備忘録です。

    VBAでは"MSForms.DataObject"からクリップボードの操作を行うことができますが、VBScriptでは取得できないため他の方法が必要です。

    私が思いついた方法としては
    1. "clip.exe"を使用する(クリップボードに送るのみ)
    2. PowerShellにコマンドを送信する
    がありますが、今回は1.の「"clip.exe"を使用する」方法について書いていきます。

    私が思いついた方法としては


    1. clip.exe”を使用する(クリップボードに送るのみ)


    2. PowerShellにコマンドを送信する


    がありますが、今回は1.の「“clip.exe”を使用する」方法をについて


    "clip.exe"とは何か

    "clip.exe"とは、Windowsに最初から入っているプログラムの一つで、種類としてはコンソール アプリケーションというものです(古いWindowsでは入ってないこともあります)。
    これを使うことでクリップボードに文字列を送ることができます。

    コンソール アプリケーションとは何か、ということですが
    ざっくり言うと、起動したときに黒画面(コンソール)が現れるプログラムです。
    例:コマンドプロンプト
    (コマンド ライン ツールと呼ばれることもあります。)


    それではまず、"clip.exe"のヘルプを確認します。
    コマンドプロンプトを起動して「clip /?」と入力すると以下のように表示されます。
    C:\WINDOWS\system32>clip /?


    CLIP

    説明:
    コマンド ライン ツールの出力を Windows クリップボードにリダイレクトします。
    その出力されたテキストをほかのプログラムに貼り付けることができます。

    パラメーター一覧:
    /? このヘルプを表示します。

    例:
    DIR | CLIP 現在のディレクトリ一覧のコピーを Windows クリップボード
    に貼り付けます。

    CLIP < README.TXT readme.txt ファイルのテキストのコピーを Windows
    クリップボードに貼り付けます。

    C:\WINDOWS\system32>clip.exe /?



    CLIP



    説明:


    コマンドライン ツールの出力を Windows クリップボードにリダイレクトします。


    その出力されたテキストをほかのプログラムに貼り付けることができます。



    パラメーター一覧:


    /? このヘルプを表示します。



    :


    DIR | CLIP 現在のディレクトリ一覧のコピーを Windows クリップボード


    に貼り付けます。



    CLIP < README.TXT readme.txt ファイルのテキストのコピーを Windows


    クリップボードに貼り付けます。



    このヘルプの例を元に、VBScriptで記述すると以下のようになります。
    Call CreateObject("Wscript.Shell").Run("%COMSPEC% /c echo " & "コピーしたい文字列" & "|clip",0)
    テキストファイルにコピペして拡張子を"vbs"に変更して実行すれば"コピーしたい文字列"がコピーされます。

    しかし、この記述には問題があり、ごく単純な文字列ならば上の例でもなんとかなりますが、改行や一部の文字が入るとうまく動作しなくなってしまいます。


    それではその問題を解決する方法を考えていきます。

    標準入力を使う


    ヘルプに二つ使用例("DIR|CLIP"と"CLIP<README.TXT")がありましたが、コンソールアプリケーションについての知識があれば、二つの使用例は同じ事を表していることがわかります。

    まず、概念の説明からしていきます
    コンソールアプリケーションには標準入力・標準出力(・標準エラー出力)という概念があります。
    それぞれプログラム外部から入力、または外部に出力するときに使われるものとなります。
    コマンドプロンプトを例にすると
    標準入力はキーボード
    標準出力(・標準エラー出力)はコンソール(黒画面)
    となっています。

    そのためコマンドプロンプトでは、キーボードからコマンドを入力できますし、その結果を画面上で確認することができます。

    この入力先・出力先は以下のような記述をすることで変更することができます。
    1. 「|」(パイプ)
      パイプは、右側の標準入力に、左側の標準出力を送る、といった動作を行います
      例:DIR|CLIP
      "CLIP"の標準入力に、"DIR"コマンドの結果(標準出力)を送る

    2. 「<」入力リダイレクト
      入力リダイレクトは、左側の標準入力に、右側のファイルの中身をテキスト化して送る、といった動作を行います。
      例:CLIP<README.TXT
      "CLIP"の標準入力に、"README.TXT"の中身を送る
    つまりヘルプの例は、"clip.exe"の標準入力にコピーしたい文字列を送れば、その文字列が“clip.exe”によってクリップボードに送られるということを表しています。

    そしてVBScriptでは“Wscript.Shell”の“Exec”メソッドからコンソールアプリケーションの標準入力に直接アクセスすることができます。

    その場合の記述が以下のようになります
    With CreateObject(“Wscript.Shell”)
    With .Exec(“clip”)
    Call .StdIn.Write(“コピーしたい文字列”)
    End With
    End With
    このように記述することで、改行などを含んだ文字列でも"clip.exe"に送ることができます

    なお、VBA・VBScript共通の問題ですが、一部の文字は文字化けしてしまいます。
    その場合はPowerShellなどのUnicodeを扱えるソフト・言語のみでの対応が必要となります。

    サンプル

    ドラッグ&ドロップしたファイルのパスをクリップボードに送るVBScriptです。
    テキストファイルにコピペして、拡張子を"vbs"にすれば使用可能です。
    '引数を、引数毎に改行してクリップボードに送るVBScript
    Option Explicit
    Const MSG_TITLE = "クリップボードにコピー"
    Const CLIP = "%windir%\System32\clip.exe"

    '異常処理:引数なし
    Dim argsCnt 'As Integer
    argsCnt = Wscript.Arguments.Count - 1
    If argsCnt = -1 Then
    Call MsgBox("ファイルをドロップしてください", vbExclamation, MSG_TITLE)
    Call Wscript.Quit
    End If


    'Join用に引数を配列化
    Dim argsArray() 'As String
    ReDim argsArray(argsCnt)

    Dim i 'As Integer
    With Wscript.Arguments
    For i = 0 To argsCnt
    argsArray(i) = .Item(i)
    Next 'i
    End With 'Wscript.Arguments


    'クリップボードに送る(コピーする)文字列作成
    Dim cpText 'As String
    Dim myDel 'As String
    myDel = vbCrLf
    cpText = Join(argsArray, myDel)

    With CreateObject("Wscript.Shell")
    With .Exec(CLIP)
    Call .StdIn.Write(cpText)
    End With '.Exec(CLIP)
    i = 3 '再利用
    Call .Popup("コピーが完了しました" & vbCrLf & "このウィンドウは" & i & "秒後に閉じます", i, MSG_TITLE, vbInformation)
    End With 'CreateObject("Wscript.Shell")

    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。