June 08, 2013

Windows7:ドロップしたフォルダーを設定した位置とサイズで開くスクリプト(VBS)

Teikoku Logo
今年から職場で使い始めた Windows7 で、最大の不満を解消!…とまでは行かないけど、なんとか我慢できる程度には改善できた。

Windows7でウィンドウを開くスクリプトについてツイートしたのが2/14…、1月にWindows7を使い始めてから1ヶ月で余りで、その使い勝手のあまりの悪さに、ついに我慢出来なくなったのか…w



参考にしたのは Microsoft Communitiyの エクスプローラーを使う時のサイズ、位置、レイアウトを各フォルダで個別に記憶させたい の回答に載っていたスクリプト「hoge.vbs」

--
hoge.vbs
--
Set ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
ie.Top=100
ie.Left=200
ie.Height=500
ie.Width=700
ie.Visible=True
ie.Navigate2 "shell:my pictures" 'フォルダパス
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.CurrentViewMode=4 '4-詳細
--

Windowsの「メモ帳」に貼り付け、ファイル名「hoge.vbs」で保存して、出来た「hoge.vbs」をダブルクリック。見事!「マイピクチャ」のウィンドウが、スクリプト内で指定された「上から100ドット、左から200ドット、高さ500ドット、幅700ドット」で開いた!素晴らしい!!

「'フォルダパス」の手前のダブルクォーテーションで囲まれた所にフォルダーのパスを入れるだけで使えて便利。
例えばローカルの「D:\FolderName」とか、サーバー上の「\\ServerName\FolderName」とか、仕事で良く使うフォルダー毎に何個が作ると格段に便利になった。

こうなると欲がでて、スクリプトファイルにドラッグ&ドロップしたフォルダーを、決まった位置とサイズで開いてくれると便利!と思い、VBSのリファレンスとかサンプルのスクリプトをググってなんとか作ってみた。


で、出来たスクリプトが「hogehoge.vbs」

--
hogehoge.vbs
--
Set objArgs = WScript.Arguments
if objArgs.Count > 0 then
Set objFS = CreateObject("Scripting.FileSystemObject")
if objFS.FolderExists(objArgs(0)) then
Set ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
ie.Top=100
ie.Left=100
ie.Height=480
ie.Width=640
ie.Visible=True
ie.Navigate2 objArgs(0)
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.CurrentViewMode=4
else
Wscript.echo "ファイルじゃなくて、フォルダをドロップしてください"
end if
else
Wscript.echo "ダブルクリックじゃなくて、フォルダをドロップしてください"
end if
--

「ie.Top〜ieWidth」の値を変えて、画面上半分、下半分、左半分、右半分などを設定したもの作りデスクトップに保存して、フォルダーをドロップして設定した位置に開ける様になった。感動。(エアロスナップは殺して有る。というか、エアロをオフにしたクラシックなフラット画面がまるでWindows8風、そして動作が見違えるように軽快に…)

このスクリプトファイルのショートカットを 「送る」メニュー(C:\Users\(ユーザ名)\AppData\Roaming\Microsoft\Windows\SendTo)に置けば、選択したフォルダーを右クリックしてスクリプトを選択して、設定した位置とサイズに開ける様になり、さらに便利度がアップ。


もっと欲がでて、ショートカットをドロップした時にリンク先フォルダーまで調べて開けたら…とか思ったり、画面の何処に開くかをダイアログで設定できても良いかも…と、思ったけどスクリプトが長くなったり、エラー処理とかいろいろ面倒臭くなって諦めた。
スクリプトはシンプルな処理だけをエラー無くやってくれる方が便利(と、言い訳)

一度は諦めたフォルダーのショートカットにも対応したスクリプトを追加。
--
hoge2.vbs
--
Set objArgs = WScript.Arguments

if objArgs.Count > 0 then
Set objFS = CreateObject("Scripting.FileSystemObject")
if objFS.FolderExists(objArgs(0)) then
OpenWin(objArgs(0))
else
if objFS.GetExtensionName(objArgs(0)) <> "lnk" then
WScript.Echo "ファイルではなく、フォルダーまたはフォルダーの" & vbcr & "ショートカットをドロップしてください。"
else
Set objShell = WScript.CreateObject("WScript.Shell")
Set LnkFile = objShell.CreateShortcut(objArgs(0))
if objFS.FolderExists(LnkFile.TargetPath) then
OpenWin(LnkFile.TargetPath)
else
WScript.Echo "ファイルではなく、フォルダーまたはフォルダーの" & vbcr & "ショートカットをドロップしてください。"
end if
end if
end if
else
WScript.Echo "ダブルクリックではなく、フォルダーまたは、" & vbcr & "フォルダーのショートカットを、1個ドロップして下さい。"
end if


Sub OpenWin(fPath)
Set ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
ie.Top=100
ie.Left=100
ie.Height=480
ie.Width=640
ie.Visible=True

ie.Navigate2 fPath

Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.CurrentViewMode=4
End Sub
--


今回のスクリプトを調べていて、なぜ「GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")」みたいな長くて憶えられない数値になってるのか気持ち悪くてググってみると、どうもIE7の頃にそれまでのIEのWebブラウザ機能と、IEのファイルブラウザ機能を分離したらしく、そのせいでスクリプトでファイルやフォルダーを扱うIEはこんな記述になったらしい…IEじゃなくエクスプローラーで出来る方法は無いのかググってみたけど…ウィンドウサイズや位置を指定して開く方法が見付けられなかった。

Windows7がフォルダーウィンドウの位置とサイズを憶えなくなった理由として、「Windows 秘話: 復元にまつわる話」という記事が有ったけど、読んでもイミが分からなかった(分からなくはないけど理解したくない、というかプログラマが面倒臭かっただけにしか思えない。実際、フォルダーの位置やサイズを憶えるフリーのソフトは少数ながら有るらしい。勤めてる職場では勝手にそんなソフトが入れられないからスクリプトでなんとかしてる…。)

AppleのOS X(Mac OS X)のFinderウィンドウは「アイコン」「リスト」「カラム」「Cover Flow」(「Cover Flow」だけ何故「カバーフロー」じゃ無いのかw)と4つの表示方法が有るけど、ウィンドウの位置もサイズも(たとえ上位のフォルダー名を変えたとしても)ちゃんと憶えてるけどなぁ…

XPやVistaで出来ていた程度の事がWindows7で出来なくなった(やる気がなくなった)のが残念でならない…
本来Vistaだったか、Window7だったかで採用されるハズだったファイルシステム(WinFS?)が搭載されていれば大丈夫だった、とかだと将来(Windows9?)にかすかな希望が持てるんだけど。

先日、家電量販店の展示品Windows8で、デスクトップ画面にフォルダーを2つ作り、それぞれ開いて位置とサイズを変更してどちらも一旦閉じ、それぞれのフォルダーで設定を憶えているか試したけど、Windows7と同じで最後に閉じたウィンドウのサイズしか憶えてなかった…orz

やっぱりファイルシステムから変わらないとダメなのかも。
ファイルのフルパスがキーになってる様なWindowsが採用している現状のファイルシステム内のデータベースだと無理なのかな…(フルパスの文字数制限も未だに残ってるし。文字数制限に引っ掛かった時は、重要じゃないフォルダーの場合はZipにして無理やりコピーして保存してるw、w事じゃない…悲し過ぎる。)


Macのファイルシステムが凄い、なんて記事はこれまでほとんど見た事がないけど、Windowsと違ってフルパスがキーじゃなくファイルシステムが独自にIDを振ってるらしく、そのお陰かフルパスの文字数制限に引っ掛かった記憶が無い。(ファイル名が単にプロパティの1つなのかな…)
以前に読んだ記事で、最初は手作業で、途中から手作業では大変だからAppleScriptを使って何処までフォルダーの中にフォルダーを作れるかチャレンジした、というのを読んだ事が有るけど、結果的に数万の深さまで作れたけど結局何処まで掘れるか分からず根負けした、とか書いて有った様な…
実際に使う時は、数万なんてフォルダー階層は使わない&使い勝手が悪過ぎだろうけど、かなり深い階層まで作っても問題ない事が分かって安心した記憶がある。

Windowsのファイルシステムがフルパスに影響される事でイヤな点は、フォルダー名を変えると詳細表示に設定してるフォルダーウィンドウの項目の幅が初期値に戻る所と、フォルダー内のファイルを開いているとフォルダー名が変更出来なくなる所。同じボリューム内でもフォルダー内のファイルが開いてると移動出来なかったかも。(OS Xだと編集中のファイルの名前とかフォルダー名とかが変えられたりするので、Windowsの制限にいつも作業の手を止められてイライラしてる事からすると、恐ろしいくらいに自由過ぎると思う。)
見易い様にフォルダーウィンドウの項目名の列幅を適当なサイズに合わせてたのに、仕事が終わってフォルダー名に「完了」とか付け加えると次に開いた時に列幅が初期値?に戻って狭くなってるとか、自分以外のWindowsを使ってる人って本当に納得して使ってるのかな?それとも自分の様に詳細表示で使うのがそもそもの間違いなのかな…


そう言えば、Vistaの頃も使い始めて1ヶ月程度でフォルダーウィンドウの位置とサイズを憶えなくなる現象が有ってググってみたら、レジストリの初期値300を5000にしろ、とか書いて有った気が…(値はうろおぼえ)
その時は面倒だけど手順にしたがって値を書き換えたけど、これって結局位置とサイズを記憶するデータベースの容量を増やしたただけで、根本的な解決になっていなかったのかも…しかもフォルダー名を変えるとこのデータベースを1つ消費して項目の幅が初期値に戻る…の繰り返しだったりして。
Vistaでレジストリを変更後、1年程でまた同じ様に位置とサイズを憶えなくなったのでもう一度設定し直した気もする…この頃から予兆はあったのかな。


Appleには「アップル - フィードバック」ページが用意されていて、使い勝手が悪いとか不具合に対する不満があれば即、ここから送る事が出来るけど、Microsoftで同じ様なページが無いか以前に探した時は、いかにもそれらしいページは有るけど、送信しようとしてらエラーになったりで結局諦めた気がする。


--
Twitterを始めてから止まってたブログの更新(何年振り?)は、Windows7やMicrosoftへの愚痴ばかりだな…(フィードバック出来ればブログに書く事も無いかもしれないのに…)
必要は発明の…っていうけど、Windows7が使い難くてカッっとなってスクリプトを書かないと対応出来ないのはとても残念に思う。
しかもWindows8でも解消されない事が分かってるし、次の8.1も期待できないだろうし…(仕事で使う道具だから洗練されて欲しいと思ってるんだけど)
Posted by 3k1 at 03:31 P | from category: 帝国だより | TrackBacks
Comments
No comments yet
:

:

Trackbacks