SyntaxHighlighter

2015年11月24日火曜日

FlashAirなどの外部ストレージを、物理的に取り外さずに再接続する(Windows)

FlashAirを使っていて、カードを抜き差しする場面は2つある。

1つは、設定の更新や、起動時Luaスクリプト実行のテストなどで
 FlashAirの電源を入れ直す必要がある場合。

もう1つは、LuaスクリプトなどでFlashAirの中身が書き換わったが
 Windows側のキャッシュが更新されていないため、見えないという状態を解決するために
 読み込み直しの手段が再接続しかなく、しかたなく行う場合。


割合としては、後者のほうが多いだろう。
SDカードスロットやUSBコネクタは、頻繁な抜き差しに耐えうる構造になっているとはいえ、
大規模なプログラムになるに連れ、デバッグにはかなりの回数の抜き差しが発生するというのは
容易に想像できる。

そこで、どこかのサイトで見かけた方法を使用することにした。

SDカードリーダーは大抵の場合、USB経由で接続されている。(外付け・内蔵問わず)
そのため、デバイスマネージャから、一度無効にし、有効にすれば、
USB機器が再接続されたものと認識され、外部記憶装置の再読み込みが行われる。

しかし、それを手動でやるのはダルい。

そこで、Windowsのドライバー作成キット、WDKに内蔵されている
Windows Device Console (devcon.exe)を使う。

devcon.exeは、デバイスマネージャでできることを、コマンドライン上で実行できるようにする
公式のツールで、バッチファイルからデバイスの操作が可能になる。

詳しくは他サイトを参照して欲しいが、以下の様なバッチファイルを作成すれば良い。

devcon disable "USB\VID_0000&PID_0000&REV_0000"
devcon enable "USB\VID_0000&PID_0000&REV_0000"

USB\VID_0000&PID_0000&REV_0000の部分については、USB機器固有の情報であり、
デバイスマネージャで対象機器(ここではSDカードリーダー)のプロパティを開き、
ハードウェアIDを参照すれば、そのままのものが載っている。

この時、バッチファイルは管理者権限で実行する必要がある。
簡単にやるのであれば、バッチファイルを右クリックし、管理者権限で実行すればよいが、

バッチファイルが起動された時、管理者権限でなければ管理者権限で実行するような
バッチを組むと、さらに便利になる。

バッチファイルからUAC昇格ダイアログを表示する by @hymtk7 on @Qiita http://qiita.com/hymtk7/items/b3b77ad3375095dcd7eb

また、この操作では、USB機器をぶち抜き、ぶっ挿していることになる。
他のツール等を組み合わせ、安全な取り外しをしてから
再接続するようにしても良いかもしれない。


自分の使っているバッチファイルを以下に示す。
動作の保証はしない。

昇格部分には、上記のページのものを参考にさせていただいた。

------ remount.bat -------

@set @temp=0/*
@echo off

whoami /groups | find "S-1-16-12288" > nul
if "%errorlevel%"=="0" (
    echo 管理者権限で実行しています。
) else (
    echo 管理者権限が必要です。
    echo Relaunching Elevated: "%~dpnx0" %*

    if '%1'=='ELEV' (
        shift
    ) else (
        cscript.exe //e:jscript //nologo "%~f0" "%~0"
        exit /B
    )
)


devcon disable "USB\VID_0000&PID_0000&REV_0000"
devcon enable "USB\VID_0000&PID_0000&REV_0000"

goto :EOF
*/
var UAC = new ActiveXObject("Shell.Application");
UAC.ShellExecute(WScript.Arguments(0), "ELEV", "", "runas", 1);