treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

substで単一ドライブ環境に2ndドライブを用意する

外付けHDDのドライブレターを維持したまま、内蔵ドライブ(c:)に移行したいということがあったので、やってみたことをご報告です。
二種類の方法のうち今回はsubstコマンドを使ってフォルダをドライブ化します。

やりたいことは前回の記事<VHDファイルで単一ドライブ環境に2ndドライブを用意する - treedown’s Report>をご覧ください。簡単に言えば外付けHDDドライブをCドライブ内のフォルダやファイルで用意しよう、という試みです。

subst:コマンドを復習

以前に何回か使ったsubstコマンド

バッチファイルでインストールEXE実行 - treedown’s Report

TIPS:パスが長くてコピーできない場合 - treedown’s Report

これはフォルダをドライブのようにマウントし、ドライブレターを割り当てた仮想的なドライブを作成してくれるコマンドです。
フォルダをドライブのルートディレクトリとしてマウントすることができるので便利です。

書式:
SUBST [ドライブ1: [ドライブ2:]パス]
SUBST ドライブ1: /D

※詳しくは<TIPS:パスが長くてコピーできない場合 - treedown’s Report>を参照

subst:フォルダにドライブレターを割り当ててHDDのように使う

はじめに:VHDを生成してマウントしたほうがsubstより簡単です。なので前回の記事<VHDファイルで単一ドライブ環境に2ndドライブを用意する - treedown’s Report>の手順のほうが推奨ですが、substコマンドでもできるということで、選択肢としてやり方を残しておこうと思います。

前置きの部分は前回と同様です。

この環境にSドライブを追加していきます。

まずは、ドライブとして割り当てるフォルダを作成しました。今回は<C:\addDrive>というフォルダを作成し、その中に<C:\addDrive\Sdrive>というフォルダを用意しました。

コマンドプロンプトを起動してフォルダの状態を確認します。

ここからsubstコマンドを使ったドライブレターの割り当て手順をスタートです。

コマンドプロンプトで

subst S: C:\addDrive\Sdrive

と入力し、Enterキーを押下します。

実行すると上図のように特にエラーもなく終了すれば成功です。

エクスプローラ上から、Cドライブとまったく同じ容量で同じ使用率のドライブが1ドライブ増えています。

このSドライブがsubstコマンドで生成したドライブレターを持つフォルダ(実体は<C:\addDrive\Sdrive>内)です。

パスの参照自体は<S:\>と<C:\addDrive\Sdrive>のどちらでファイルの操作を実行しても、同じ結果となります。

例としてtest.txtを作成してみましたが、どちらの画面で表示しても同じtest.txtが表示されます。

あとは単純にタスクスケジューラで、

このコマンド構文を追加してやれば起動時に毎回substが実行され、フォルダがドライブとしてマウントされるようになります。(substのドライブ追加も再起動時に切断されてしまうので、毎回実行が必要)

選択肢の違い

substはフォルダをドライブのように見せるコマンドなので実体はフォルダとして別途存在しています。
ただ、原則としてマウントが解除されるタイミングは手動でsubstコマンドで解除したときなのですが、知らないうちにマウント解除される、ということはあるかも。(出会ったことはないけど)
また.vhdファイルをマウントするよりは事前の操作は手間が掛かります。

ただしsubstとちがって.vhdファイルの破損や.VHDファイルが書き込まれている箇所に不良セクタが発生すると、ドライブ上のデータはまるごと損失してしまう、と言う点はsubstと比較した際の唯一のデメリットと言えそうです。substは実体がフォルダなので、ファイル単位で損失するので全滅ということはなさそう。

再起動やシャットダウン時に切断されてしまうため、起動時に毎回タスクスケジューラを使って接続処理を要する点も同じです。

ただ、substのコマンドをそのまま毎回実行するより、ちょっと判定を入れた方がいいんじゃないかと考えて、バッチファイルを作成してみることにしました。

substのマウント有無を判断して実行するバッチ

substコマンドでフォルダがマウントされてドライブレターが(狙ったように)割り当てられているかどうかを確認し、割り当てられていなければsubstコマンドを実行してフォルダをドライブに割り当てる、というバッチを作ってみました。これをタスクマネージャなどでスタートアップ時とかログオン時などに実行すれば、substの状態を人間が気にすることはなくなると思います。

--------------------------------------------------------------
sbstCHK.bat
--------------------------------------------------------------
@echo off
rem 割り当てたいドライブレターを記述
set DrvLT=S:
rem ドライブに割り当てるフォルダをフルパスで記述
set Dfolder=C:\addDrive\Sdrive
rem エラーをファイルに取得するときに指定
set LogFile=

if exist %DrvLT%\ goto AlreadyDrive
       if not exist "%Dfolder%" goto NoSourceF
       subst %DrvLT% "%Dfolder%"
goto end

:AlreadyDrive
echo 既にドライブレターは使われています。
rem '以下はログファイル用
rem echo  %date:/=-%   既にドライブレターは使われています。>>%LogFile%
goto end

:NoSourceF
echo substでドライブに割り当てるフォルダがありません。
rem '以下はログファイル用
rem echo %date:/=-%   substでドライブに割り当てるフォルダがありません。>>%LogFile%
goto end

:end
set DrvLT=
set Dfolder=
--------------------------------------------------------------

動作は、

Sドライブ(のドライブレター)が使われていたら何もせずに終了
ドライブに割り当てるフォルダが見つからない場合には何もせずに終了
ログは出力しないので、出力したい場合には変数%LogFile%に保存パスと「>>%LogFile%」とある行をコメントアウト解除する

という感じです。簡単なバッチなのでsubstを実行するというだけの単機能です。

タスクスケジューラに登録

タスクスケジューラは通常バッチファイルのタスクを登録するように設定します。

タスクの作成ウインドウから、

タスク名を入力するほかは上記のようにデフォルトで大丈夫です。

次のトリガータブでは、

タスクの開始:ログオン時に指定し、フォルダへのアクセス権を持つユーザがログオンしたときだけ実行することにしました。

操作欄には、

前述のバッチファイルを実行するように指定します。

これで、再起動してみると、

ちゃんとバッチファイルが動作していれば、このようにS:が毎回ログオン時にマウントされるようになっています。