【VBS】ネットワークドライブに再接続できませんでしたなんて言わないよ絶対

2018年1月13日

networkdrive-vbs

前回、「プレゼントにピッタリな20,000円くらいのNAS」で、NASを取り上げました。
NASを設置したら、たぶんネットワークドライブを張る方が多いと思います。
が、PC起動時に「ネットワークドライブに再接続できませんでした」のエラーを見たことがある方も多いかと思います。
画面の右下にピョッと出てくるアレです。
自動ログオンしていれば、見ることがあると思います。

スポンサーリンク

これを回避したい

なんかイラっとしますよね、アレ。
ちょっと調べてみると、先人たちがVBSで回避しているという情報をもとに、わたしも同じ方法でやっておりました。
3行くらいコピペすればできる感じでした。
こんなかんじ。

WScript.sleep 2000
Set objNetwork = CreateObject("WScript.Network")
objNetWork.MapNetworkDrive "Z:", "\\192.168.1.10\NAS"

でも、NASの電源を落としていたタイミングがありまして、その時はエラーが出ていたんですよ。
こんなかんじ。

NetworkDriveError

いやいや、知ってるし。
NASの電源落としてたの、知ってるし。

これも回避したい

ということで、アレコレなんやかんや調べていじった結果、こうなりました。

' --------------------------------
' 定数
' --------------------------------
Const SERVER_IP = "192.168.1.10" ' NASのIPアドレス
Const DRIVE_LETTER = "Z:"        ' ネットワークドライブのドライブレター
Const SHARED_FOLDER = "NAS"      ' 共有フォルダ名
Const USER_NAME = "user"         ' アクセスするユーザー名
Const USER_PASS = "password"     ' ユーザーパスワード
Const WAIT_TIME = 2000           ' pingを打つまでの待機時間(ミリ秒)

' -------------------------------------
' ネットワークドライブの割り当て
' -------------------------------------
if fncPing(SERVER_IP) Then
  Dim connectFolder: connectFolder = "\\" + Server_IP + "\" + SHARED_FOLDER
  Set objFSO = CreateObject("Scripting.FileSystemObject")

  ' ドライブレターが使用されているか
  if Not objFSO.DriveExists(DRIVE_LETTER) Then
    Set objNetwork = CreateObject("WScript.Network")
    objNetWork.MapNetworkDrive DRIVE_LETTER, connectFolder, false, USER_NAME, USER_PASS
    Set objNetwork = Nothing
  Else
    MsgBox "「" + DRIVE_LETTER + "」" + " はすでに使用されています",,"エラー"
  End if
Else
   MsgBox "「" + SERVER_IP + "」" + "から応答がありません",,"エラー"
End if

' -------------------------------------
' pingが通るか
' -------------------------------------
Function fncPing(host)
  WScript.sleep WAIT_TIME
  Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
  Set colItems = objWMI.ExecQuery("select * from Win32_PingStatus where address ='" & host & "'")

  For Each objItem In colItems
   If objItem.StatusCode = 0 Then
    fncPing = True
   Else
    fncPing = False
   End If
  Next

  Set objItem = Nothing
  Set colItems = Nothing
  Set objWMI = Nothing
End Function

※定数部分は、自身の環境に合わせて変更が必要です。

これで回避できる

あとは、起動時(ログオン時)に実行するために
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
※ユーザー名部分に、自身のユーザー名を入力

上記のフォルダに、
vbsEdit

こんな感じでvbsファイルを作成・保存してもらえれば、「再接続できませんでした」というエラーもなく接続できると思います。
エラー文が日本語のため、メモ帳以外のエディターで編集する場合は、Shift JISで保存する必要があります。

やだ、恥ずかしい///

1.pingが通って
2.ドライブレターが使用されていなければ
3.ネットワークドライブの割り当て

という流れです。
それにしてもなんか、こんなコードを大っぴらにしたことがないので、変数名とか恥ずかしいですね。
英語の学のなさを露呈している感が、プンプンしてしまいます。
(Google翻訳さん、ありがとう)

そんなわたし自身に、先人のありがたいお言葉を贈ろうと思います。

「ちっちゃいことは気にすんな。それ、ワカチコワカチコ。」

↓↓↓ブログランキングに参加しています↓↓↓

にほんブログ村 PC家電ブログへ

スポンサーリンク