プログラミング

VBScriptで、クリップボードに文字列をコピーする

2009年6月7日

Windows NTのcmd.exeでは、ファイルをcmdのウインドウにdrag&dropすることで、ファイルのフルパスを入力することができた。これは、XP以降ではできなくなったようで(もしかしたら、Vista以降かな?)、不便を感じたので、SendToからファイルパスをクリップボードにコピーするスクリプトを書いてみた。

最近はほとんどEXEファイルを作成することがなくなったので、今回もVBScriptで。で、Googleで『vbscript クリップボード』という検索語で調べてみると、マイクロソフトのページが最初に出た。

Hey, Scripting Guy!
WSH と VBScript のいずれにもクリップボードを操作する機能はありません。どちらを使用しても、クリップボードにデータをコピーしたりクリップボードからデータを貼り付けたりすることはできません。一方、Internet Explorer ではクリップボードを操作することができます

VBScriptではできないらしい。Googleの検索で出てくるほかのページでも、大体、似たようなことをしている。これは、ちょっと残念。クリップボードにコピーするためだけにIEを起動するのは、その時間が多分待っていられないだろうと思った。

何とかならないかと、少し考えて作成したのが次のスクリプト。

option explicit
dim i,arg,wsh
set arg=WScript.Arguments
set wsh=CreateObject("WScript.Shell")
if arg.count=0 then wscript.quit
arg=arg.item(0)
if arg=":::" then
  for i=1 to 100
    if wsh.appactivate ("argument is as follows") then exit for
    wscript.sleep 100
  next
  wsh.sendkeys "^c{ENTER}"
else
  wsh.run "wscript.exe """ & WScript.ScriptFullName & """ :::"
  inputbox "argument is as follows","argument is as follows",arg
end if


始め、InputBoxに表示させるだけのスクリプトにして、手動で『Ctrl+C』を押せば良いかなと考えた。それなら、『Ctrl+C』を押す操作も自動にしてしまえば良いということでできたのが上記のスクリプト。これを、適当なファイル名(拡張子は、.vbs)で保存して、SendToフォルダにコピーすればOK。ファイル名をクリップボードに入れたいファイルのアイコンを右クリックし、『Send To』から新しく作成したVBScriptのファイルを指定すればよい。

ちなみに、クリップボードの値を取得したい場合、上記"^c{ENTER}"を"^v{ENTER}"に変更し、InputBoxの戻り値を取得するようにすればよい。

コメント

acchan (2012年1月15日 07:00:24)

はじめまして。
ちょうどこのような作業をしたく検索したところ
本記事に出会いました。
「Ctrl+C」のくだりが特に参考になりました。

複数選択時のファイル名が欲しかったので、少し手を加えさせていただき
利用しています。後の備忘のため、こちらで共有させてください。
------------------
Option Explicit

Dim I,objArgs,objWsh,strArgs
Set objArgs=WScript.Arguments
Set objWsh=CreateObject("WScript.Shell")

If objArgs.count=0 Then Wscript.Quit

If objArgs.Item(0)=":::" Then
  For I=1 To 100 'Inputbox待ち
    If objWsh.Appactivate ("argument is as follows") Then Exit For
    Wscript.Sleep 100
  Next
  objWsh.Sendkeys "^c{ENTER}"
Else
  objWsh.Run "wscript.exe """ & WScript.ScriptFullName & """ :::"
  strArgs=""
  For I = 0 to objArgs.Count - 1
    strArgs=strArgs & objArgs(I)
    If objArgs.Count<>1 Then strArgs=strArgs & vbCrLf
  Next
  Inputbox "argument is as follows", "argument is as follows", strArgs
End If

コメント送信