3.23.2012

Pseudo folder with VBScript

VBScript: 擬似フォルダの作成

機能要件

Windows のフォルダ(へのリンク)と同じような動作をするスクリプトを作成する。
引数によって実行時の挙動を変える。

引数なし(スクリプトをダブルクリックした時):
  コード中に定義したフォルダをエクスプローラで開く。

引数あり(ファイル・フォルダをドラッグ&ドロップした時):
  引数で指定されたパスのファイル・フォルダ全てを、コード中に定義したフォルダ配下へ移動する。
  同名のファイル・フォルダが既に存在している場合は、エラーを通知し処理を中止する。

対象フォルダが存在しない場合はエラーを通知する。

コード

'// PseudoFolder.vbs
kPath = "C:\Temp"  ' Path to the folder
kPathNotFound = &H004C

Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(kPath) Then Err.Raise kPathNotFound

For Each arg In WScript.Arguments
  If fso.FileExists(arg) Then
    fso.MoveFile arg, kPath & "\"
  ElseIf fso.FolderExists(arg) Then
    If fso.GetDriveName(arg) = fso.GetDriveName(kPath) Then
      fso.MoveFolder arg, kPath & "\"
    Else
      fso.CopyFolder arg, kPath & "\", False
      fso.DeleteFolder arg, True
    End If
  Else
    Err.Raise kPathNotFound
  End If
Next

If 0 = WScript.Arguments.Count Then CreateObject("Shell.Application").Open kPath

概要

このスクリプトに対するショートカットを作り、フォルダのイメージをアイコンに設定すれば、まさに擬似的なフォルダとして機能するだろう。

普通のショートカットと比べると以下のような利点がある。

・フォルダのパスを動的に定義できる
・ドライブの違いを意識せず、ドラッグ&ドロップで確実に移動処理を行える
 (エクスプローラでは同一ドライブなら移動、異なるドライブならコピーが行われる)

留意事項

・異なるドライブ間で Scripting.FileSystemObject.MoveFolder を行うと失敗する。
 (内部的にはリネームと同じ処理らしい?)
 面倒ではあるが、Scripting.FileSystemObject.GetDriveName でチェックしてドライブが異なっていたら
 コピーと削除を分けて行わないといけない。

・フォルダの開き方は、WScript.Shell.Run よりも Shell.Application.Open のほうが安全かと思う。

・各メソッドのおさらい。

object.MoveFile ( source, destination );
 ⇒ destination をバックスラッシュで終わらせることで、明示的にフォルダと認識させる。
   同名ファイルが存在する場合はエラーとなる。

object.MoveFolder ( source, destination );
 ⇒ destination をバックスラッシュで終わらせることで、明示的に既存フォルダと認識させる。
   同名のファイルやフォルダが存在する場合はエラーとなる。

object.CopyFolder ( source, destination[, overwrite] );
 ⇒ destination をバックスラッシュで終わらせることで、明示的に既存フォルダと認識させる。
   上書きを抑止するため、第3引数に False を与える。

object.DeleteFolder ( folderspec[, force] );
 ⇒ 読み取り専用フォルダも削除するため、第2引数に True を与える。

http://msdn.microsoft.com/ja-jp/library/cc428039.aspx
http://msdn.microsoft.com/ja-jp/library/cc428108.aspx
http://msdn.microsoft.com/ja-jp/library/cc427986.aspx
http://msdn.microsoft.com/ja-jp/library/cc427996.aspx

・フォルダ存在チェックで Raise させているのは 0x4c (10進数では76) Path not found。

エラーコードの一覧は以下を参照。
http://www.csidata.com/custserv/onlinehelp/vbsdocs/vbs241.htm

0 件のコメント:

コメントを投稿