« H.W.ハインリッヒ/D.ピーターセン/N.ルース「産業災害防止論」海文堂 井上威恭監修 (財)総合安全工学研究所編訳 | トップページ | ローレン・ビュークス「ズー・シティ」ハヤカワ文庫SF 和爾桃子訳 »

2013年12月20日 (金)

Windows用:バックアップを取ってエディタを起動するVBScript

 ちょっとした文章を書くとき、KeEditor(K2 Software's Page) を使っている。高機能なのに軽快なのが嬉しい。おまけに HTML や JavaScript などの構造化テキストにも対応してて、便利極まりない。

 その K2Editor で、しょっちゅう弄ってるテキスト・ファイルがある。メモ用の文書で、仮に名前を memo.txt としよう。ほとんと毎日、何行か追加して別の行を削除している。間違って重要な行を削除して保存しちゃったら困るんで、できれば memo.txt を開いたら、自動でバックアップを取って欲しい。

 たぶん K2Editor の設定かマクロでも出来ると思う。機能が豊富なヴァージョン管理システムもあるけど、私が欲しいのはそこまで大袈裟なシロモノじゃないし、何より K2Editor の優れた魅力である「軽快さ」が失われてしまう。

 など色々あって、結局は Windows の VBScript で作った。なんたって初めて作った VBScript だ。ブログのネタにもなるし、恥を晒してみる。せいぜい笑ってください。

【何をするのか】

  • テキスト・ファイル(仮に memo.txt)を Drag&Drop して起動する。
  • memo.txt を、デスクトップの backup フォルダにバックアップする。
  • テキスト・エディタ(今回は K2Editor)を起動して、memo.txt を開く。

 副作用:デスクトップにフォルダ backup がない場合は、勝手に backup を作る。

【動作環境】

 以下の環境で作り、動作確認した。

  • OS:Windows 7 Home Premium / Service Pack 1
  • K2Editor:r。1.5.9 Build 522

【必要な物】

  • Windows7 およびソレが動くパソコン
  • テキスト・エディタ:Windows 付属の「メモ帳」でもイケます、ちょっと弄る必要があるけど

【インストール】

  1. テキスト・エディタを起動する。
  2. 次に示すソース・プログラムをコピー&ペーストする。
  3. 拡張子 .vbs で保存する。仮にここでは、k2.vbs としよう。
  4. テキスト・エディタを終了する。

以上です。

【ソース・プログラム】

' 2013.12.14 make backup file and kick K2Editor
' Drag&Dropしたファイルやショートカットを、
' デスクトップのbackupフォルダにコピーしエディタ(K2E.exe)を起動する
Option Explicit
Dim WSH, FSYS, iName, oName, oFolder
Const backUpFolder = "backup"                    ' バックアップ先のフォルダ名
Const editor = """C:\Program Files (x86)\k2e\K2E.exe""" ' K2Editorを使うとき
'Const editor = "C:/WINDOWS/system32/notepad.exe"        ' notepadを使うとき

Set WSH = WScript.CreateObject("Wscript.shell")
' ダブルクリックで起動したら使い方を表示して終わる
if WScript.Arguments.length <= 0 then
    Call MsgBox( "Drag&DropしたファイルをバックアップしてK2Eを起動します" )
    WScript.Quit
end if

Set FSYS = WScript.CreateObject("Scripting.FileSystemObject")
iName = getTarget( WScript.Arguments.Item(0) ) 'ショートカットなら実体に変換
' バックアップ先のフォルダがなければ作る
oFolder = "C:\Users\" + WSH.ExpandEnvironmentStrings("%USERNAME%") + "\Desktop\" + backUpFolder
if not FSYS.FolderExists( oFolder ) then
    FSYS.CreateFolder( oFolder )
end if

oName = oFolder + "\" + FSYS.getFileName( iName )
FSYS.CopyFile iName, oName 'バックアップを作る
WSH.Run editor + " " + WScript.Arguments.Item(0) 'エディタを起動
'Call MsgBox( oName )

' getTarget( arg ) argがショートカットなら実体を見つけて返す
Function getTarget( arg )
    Do while FSYS.GetExtensionName( arg ) = "lnk"
        arg = WSH.CreateShortcut( arg ).TargetPath
    Loop
    getTarget = arg
end Function

【使い方】

 編集したいテキスト・ファイルを、k2.vbs に Drag&Drop する。
 →デスクトップのフォルダ backup にテキスト・ファイルの複製を作り、K2Editor が起動する。

【副作用】

 勝手にデスクトップに backup というフォルダができます。
 バックアップしたファイルは、このフォルダの中にあります。

【使用上の注意】

 仮に使って何か被害を受けたとしても、私は一切関知しません。

【よくある(と思われる)質問】

Q:K2Editor 以外のテキスト・エディタを使いたいんだけど。Windows 付属のメモ帳とか。
A:7行目と8行目が、こうなってますね。

Const editor = """C:\Program Files (x86)\k2e\K2E.exe""" ' K2Editorを使うとき
'Const editor = "C:/WINDOWS/system32/notepad.exe"        ' notepadを使うとき

 それを、こんな風に変えてください。私が試した時は動きました。

'Const editor = """C:\Program Files (x86)\k2e\K2E.exe""" ' K2Editorを使うとき
Const editor = "C:/WINDOWS/system32/notepad.exe"        ' notepadを使うとき

Q:こんなん、バッチ・ファイル(.bat)で充分じゃね?
A:私も最初はそう思って、バッチファイルで作り始めました。
 ところが、状況によって思うように動かない場合があるんです。
 テキスト・ファイルではなく、ショート・カットを Drag&Drop すると、
 バックアップを取る際に本体のテキスト・ファイルではなく、
 ショート・カット(.lnk)をコピーしちゃうんです。

Q:ちゃんと動かないんだけど。
A:そういう事もあります。

【愚痴】

 まあ、アレだ。先に書いたように、最初は「お、簡単じゃん、copy してエディタを起動するだけだろ、.bat でイケるじゃん」とか思ってやてみたら、大コケ。xcopy とか調べたけど、結局はダメだった。

 ってんで、「Windows ショートカット 実体」とかで検索しまくって、「なんか VBScript ってのがあるらしい」ってのに気がつくまで約半日。うはは、VBScript も知らないとは恥ずかしい。今は Windows Power Shell なんてのもあるとかで、世の中は便利になってるなあ。

 それで何も知らない状況で、とりあえず作り始めたけど、なんたって文法すら知らないプログラム言語でモノを作ろうってんだから、吾ながら無謀さに呆れる。まあこれで拡張子 .vbs n意味がわかった。やあめでたい。

 「よーわからんが基本BASICだよね」とか思ってるから、Dim は「なんか変数を定義してるんだろうなあ」、Set は「たぶん代入だよね」と見当つくのはいいが。最初は注釈の書き方すら分からなかった。たぶんシングル・クォートから行末までなんだろう。ちなみに今でも、1ステートメントが複数行に跨る場合の書き方はわからんです。

 アチコチの資料サイトを漁ってサンプルから1行づつコピーしちゃ、MsgBox で確認しながら進めてくナメてると、いきなり WScript.CreateObject とか、「なんじゃそりゃあぁ!」と驚いたり。今はやりのオブジェクト指向なんだろうけど。いや便利だよね、MsgBox。

 とまれ、実は言語仕様なんて障壁としちゃ簡単な方で。やっぱりね、シンドイのはOSやファイル・システムのサービスを使う API。もうね、1行書くごとに検索して API を調べるような有様。ああ情けない。

 API ったって、昔みたいにサービス・ルーチンの入り口名と引数だけ調べりゃいいってモンじゃない。オブジェクト指向だから、各オブジェクトの意味から構造まで調べなきゃいけない。オブジェクト指向って、便利なようだけど、シロウトには敷居が高くなっちゃってるよなあ。ってんで、調べたのはこの辺。

Drag&Drop したモノを、どうやって知るのか。
WScript.Arguments に、イロイロ入ってるらしい。
数は WScript.Argument.length。なければ値は負数、1個ならゼロ。
モノは、 WScript.Arguments.Item(n)にある。nはゼロから。

モノがショートカットかどうか、どうやって調べる?
他の方法もあるようだけど、今回は拡張子が .lnk ならショートカットと判断した。

拡張子は、どうやって調べる?
ファイル・システム・オブジェクト.GetExtensionName( フルパス名 )

ショートカットから、どうやって実体を探す?
シェル・オブジェクト.CreateShortcut( ショートカット )でショートカット・オブジェクト(仮に s とする)を作り、
s.TargetPath で実体のフルパスがわかる。

デスクトップのフルパスは、どうやって得る?
C:\Users\ユーザ名\Desktop
# 今 set コマンドで調べたら、 %HOMEDRIVE%:\HOMEPATH\Desktop の方がよさそうだなあ

ユーザ名は、どうやって得る?
環境変数 USERNAME に入ってる。

環境変数の中身は、どうやって得る?
シェル・オブジェクト.ExpandEnvironmentStrings("%環境変数名%")

backup フォルダの有無は、どうやって調べる?
フォルダの有無は ファイル・システム・オブエクト.FolderExists( フォルダ名 )でわかるよ

フォルダはどうやって作る?
ファイル・システム・オブジェクト.CreateFolder( フォルダ名 )

ファイルのコピーはどうすんの?
ファイル・システム・オブジェクト.CopyFile 元ファイル, 新ファイル

エディタはどうやって起動する?
シェル・オブジェクト.Run "エディタのフルパス 引数”

エディタのフルパス中に空白があるんだけど?
三重のダブルクォートで囲もう。

メモ帳はどこにある?
たいてい C:\WINDOWS\system32\notepad.exe

と、まあ、そんな風に、最近のプログラムってのは敷居が高くなっちゃってるなあ。いや私の足が短いだけなのかも知れないけど。

|

« H.W.ハインリッヒ/D.ピーターセン/N.ルース「産業災害防止論」海文堂 井上威恭監修 (財)総合安全工学研究所編訳 | トップページ | ローレン・ビュークス「ズー・シティ」ハヤカワ文庫SF 和爾桃子訳 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/201750/58790022

この記事へのトラックバック一覧です: Windows用:バックアップを取ってエディタを起動するVBScript:

« H.W.ハインリッヒ/D.ピーターセン/N.ルース「産業災害防止論」海文堂 井上威恭監修 (財)総合安全工学研究所編訳 | トップページ | ローレン・ビュークス「ズー・シティ」ハヤカワ文庫SF 和爾桃子訳 »