2010年11月13日土曜日

◆追加ソフト無しにSkyDriveをエクスプローラにマウントする

これを使ってPowershellで何かできないかな。

MTG Blog: ◆追加ソフト無しにSkyDriveをエクスプローラにマウントする

という事で、エクスプローラからSkyDriveにアップロードするときは拡張子が制限されている。
そこでアップロードするときに拡張子を「xls」に偽装し、ダウンロードするときに元に戻すというスクリプトを作ってみた。

簡単に出来るかと思ったのだがやけに苦労した(笑)
スクリプトはこんな感じ。

$skyDrivePath = "\\a1gkoa.docs.live.net@SSL\DavWWWRoot\XXXXXX\^.Documents"
$deskTop = [environment]::GetFolderPath("desktop")
$ext = "xls","xlsx","doc","docx","ppt","pptx","txt"
$pattern1 = ".+@SSL.+\\(.*\.\w*)\.\w*"
$pattern2 = ".*\\(.*\.(\w*))"
$mode = "Put"

$path = Split-Path $args[0]
$path = $path.replace("\.Documents","\^.Documents")
if($path -eq $skyDrivePath){$mode = "Get"}

if($mode -eq "Get"){
    foreach($file in $args){
        $file = $file.replace("\.Documents","\^.Documents")
        if($file -match $pattern1){
            Copy-Item $file ($deskTop + "\" + $matches[1])
        }else{
            Copy-Item $file $deskTop
        }
    }
}else{
    foreach($file in $args){
        if($file -match $pattern2){
            if($ext -contains $matches[2]){
                Copy-Item $file $skyDrivePath 
            }else{
                Copy-Item $file ($skyDrivePath + "\" +  $matches[1] + ".xls") 
            }
        } #拡張子の無いファイルは無視
    }
}

これを以下のようなバッチで呼んであげる。

@echo off
powershell  "& 'C:\TOOLS\Copy2Sky-Item.ps1' "%*""


そして、このバッチのショートカットをSendTo(送る)フォルダーへ登録する。
ちなみに、SendToフォルダーを開くには「ファイル名を指定して実行」からShell:SendTo と打てば良い。(Windows7)

送り元がSkyDriveのパスだったらDesktopへ決め打ちでダウンロード(コピー)、そうで無かったらSkyDriveのDocumentsフォルダへアップロード(コピー)している。

SkyDriveのWebDavのパスにはカレット「^」を含んでいて、これがバッチファイルに引数として渡ったときに欠落してしまうようだ。(欠落するファイルとしないファイルがあって色々と悩んだ)
そこでコピーするときに無理やり「^」を補っている。

また、$extで保持しているSkyDriveが許容する拡張子は全てを調べたわけでは無い。とりあえず自分で使いそうなものだけ指定した。
上書きなどもチェックしていない。
正規表現もとりあえずうまくいっているレベルだと思う。

さしあたって、ファイル名に空白を含む場合はエラーとなる。

0 件のコメント:

コメントを投稿