C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ネットワークドライブを手軽に設定する

どちらかと言うと、こちらの続きです。
ネットワークドライブの名前 - C#ATIA

近い将来、複数のPCで複数のネットワークドライブを設定する事に
なると思うのですが、ネットワーク担当者(僕じゃない)的には
”各自で設定して”
となりそうな雰囲気なので、さすがに面倒。

各自で行うと同じような設定にならない(過去に苦労した)可能性
もあり、プログラム的な方法で統一した設定にしたいです。


最初は”バッチファイルで設定させよう・・・”と思ったのですが、
僕の理解が不足し過ぎていて困難。
ひょっとしてVBScriptで出来るのでは?と調べた所出来る事が
分かりました。(社内PCはWindowsのみです)

こちらはネットワークドライブを設定するVBScriptです。

Sub main()

    Dim driveMap
    driveMap = Array( _
        Array("O:", "\\hoge\share"), _
        Array("P:", "\\piyo\share"), _
        Array("Q:", "\\fuga\share") _
    )

    Dim userName
    userName = InputBox("ユーザー名を入力してください")
    If Len(userName) < 1 Then Exit Sub

    Dim pass
    pass = InputBox("パスワードを入力してください")
    If Len(pass) < 1 Then Exit Sub

    Dim i, driveNames
    driveNames = ""
    For i = 0 To UBound(driveMap)
        driveNames = driveNames & "[" & driveMap(i)(0) & "],"
    Next

    Dim msg
    msg = "以下" & UBound(driveMap) + 1 & "個のネットワークドライブを設定します。" & vbCrLf & driveNames & vbCrLf & "宜しいですか?"

    If MsgBox(msg, vbQuestion + vbYesNo) = vbNo Then
        Exit Sub
    End If

    Dim objWshNetwork
    Set objWshNetwork = WScript.CreateObject("WScript.Network")

    msg = ""

    On Error Resume Next

    Dim res
    For i = 0 To UBound(driveMap)
        objWshNetwork.MapNetworkDrive driveMap(i)(0), driveMap(i)(1), False, userName, pass

        If Err.Number = 0 Then
            res = "成功"
        Else
            res = "失敗"
        End If

        msg = msg & "ドライブ[" & driveMap(i)(0) & "]-" & res & vbCrLf
        Err.Number = 0
    Next

    MsgBox msg
    
End Sub

call main()

driveMap変数内の各配列は

array("設定するドライブ名","該当するフォルダパス")

です。
当然、該当するフォルダパスにアクセスする権限の無いユーザー名では
失敗しますし、既に設定済みのドライブ名を指定すると失敗します。

テストする関係上、削除するVBScriptも必要だったため作成しました。

Sub main()

    Dim driveMap
    driveMap = Array( _
        Array("O:", "\\hoge\share"), _
        Array("P:", "\\piyo\share"), _
        Array("Q:", "\\fuga\share") _
    )

    Dim i, driveNames
    driveNames = ""
    For i = 0 To UBound(driveMap)
        driveNames = driveNames & "[" & driveMap(i)(0) & "],"
    Next

    Dim msg
    msg = "以下" & UBound(driveMap) + 1 & "個のネットワークドライブを削除します。" & vbCrLf & driveNames & vbCrLf & "宜しいですか?"

    If MsgBox(msg, vbQuestion + vbYesNo) = vbNo Then
        Exit Sub
    End If

    Dim objWshNetwork
    Set objWshNetwork = WScript.CreateObject("WScript.Network")

    msg = ""

    On Error Resume Next

    Dim res
    For i = 0 To UBound(driveMap)
        objWshNetwork.RemoveNetworkDrive driveMap(i)(0)

        If Err.Number = 0 Then
            res = "成功"
        Else
            res = "失敗"
        End If

        msg = msg & "ドライブ[" & driveMap(i)(0) & "]-" & res & vbCrLf
        Err.Number = 0
    Next

    MsgBox msg
    
End Sub

call main()

こちらのdriveMap変数内の配列は二次元配列になっていますが、
二次元目は不要です。(コピペで済ませたかった)


同じ結果が得られるのであれば、楽した方が良くないですか?