質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • VBScript

    212questions

    VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Zドライブがネットワークドライブに割り当てられている時の分岐処理

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 206

ionn

score 7

Zドライブがネットワークドライブに割り当てられている場合、切断処理を実行させたいのですが、どのように分岐処理を入れればいいか困っています。

教えてください、お願いします。

Option Explicit
On Error Resume Next

Dim objWshNetwork   ' WshNetwork オブジェクト
Dim strDrive        ' ドライブ名

Set objWshNetwork = WScript.CreateObject("WScript.Network")
    strDrive = "Z:"

If ネットワークドライブZが繋がっている Then
        WScript.Echo strDrive & " ドライブを切断しました。"
        objWshNetwork.RemoveNetworkDrive strDrive, True, True
End If

Set objWshNetwork = Nothing
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

その前の行でRemoveNetworkDriveしているので、ifの時点ではつながっていないのでは?

質問修正への対応

RemoveNetworkDriveするのに事前に調べる必要はありません。

Option Explicit

Dim objWshNetwork   ' WshNetwork オブジェクト
Dim strDrive        ' ドライブ名

Set objWshNetwork = WScript.CreateObject("WScript.Network")
    strDrive = "Z:"

On Error Resume Next
objWshNetwork.RemoveNetworkDrive strDrive, True, True
On Error Goto 0
If Err.Number = 0 Then
    WScript.Echo strDrive & " ドライブを切断しました。"
ElseIf Err.Number = -2147022646 Then
    'WScript.Echo strDrive & " ドライブは接続されていませんでした"
Else
    'その他のエラー(ネットワークのエラーなど)
    Err.raise Err.Number
End If

Set objWshNetwork = Nothing

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 17:14 編集

    回答ありがとうございます。

    すみません、コードが間違っていたので修正しました

    キャンセル

  • 2018/04/26 21:54

    つながっていないドライブに対して、RemoveNetworkDrive を行っても害は無いので、
    on error resume next
    した状態であれば、確認せずに RemoveNetworkDrive してかまいません。
    追記しておきます。

    キャンセル

checkベストアンサー

+1

ネットワークドライブの一覧はEnumNetworkDrivesで取得できるようなので、取得されたコレクション中にZドライブがあるかないかで判断できそうです。
以下は動作未確認ですが、こんな感じにすればよいのではないでしょうか。

Option Explicit
On Error Resume Next

Dim objWshNetwork   ' WshNetwork オブジェクト
Dim strDrive        ' ドライブ名

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

strDrive = "Z:"

' ネットワークドライブ確認
Set oDrives = objWshNetwork.EnumNetworkDrives
Dim zmap
zmap = False
For i = 0 to oDrives.Count - 1 Step 2
    If oDrives.Item(i) = strDrive Then
        zmap = True
        Exit For
    End If
Next

' 接続されていたら切断する
If zmap Then
    objWshNetwork.RemoveNetworkDrive strDrive, True, True
    WScript.Echo strDrive & " ドライブを切断しました。"
End If

Set objWshNetwork = Nothing

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 17:15 編集

    回答ありがとうございます。

    こちらのコードを試してみましたが、繋がっていないにもかかわらず

    If zmap Then
    objWshNetwork.RemoveNetworkDrive strDrive, True, True
    WScript.Echo strDrive & " ドライブを切断しました。"
    End If
    この処理が実行されてしまうようでした

    キャンセル

  • 2018/04/26 17:20

    私の環境だとWScript.Networkが生成できなかったので、もしかしたら同じ現象が発生していないでしょうか。
    それだとおかしな動きになるかもしれません。
    oDrives.Countの値を出力したりしてみて、確認してみてください。

    キャンセル

  • 2018/04/26 17:53

    確認ですが、そもそもRemoveNetworkDriveで切断ってできてますか?

    キャンセル

  • 2018/04/26 18:21

    >ionn さん
    On Error Resume Nextはコメントにしてのデバッグをお薦めします。

    キャンセル

  • 2018/04/26 20:29

    変数宣言がない状態で行っていたので不具合があったようでした。
    無事に出来たのでベストアンサーとさせていただきます。

    キャンセル

+1

On Error Resume Nextしているので、無条件に切断でも良いのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 17:28

    回答ありがとうございます。

    無条件に切断の処理を入れてしまうとその後の入れる予定のErr.Numberでの分岐処理でエラーが切断されていない状態で実行したから起こったのか、別のエラーで起こったのかが分からなくなってしまうので今回、このような質問をさせて頂きました。

    キャンセル

+1

ttyp03さんの回答に変数宣言を追加すれば問題なさそうですが、別案を。

邪道(ネットワークドライブかどうかを判定していない)ですが、シンプルにやる場合の一つの手として。

'...
strDrive = "Z:"
Dim fso 'As Scripting.FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FolderExists(strDrive) Then
    WSH.Echo strDrive & " ドライブを切断しました。"
    objWshNetwork.RemoveNetworkDrive strDrive, True, True
End If
'...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 20:22 編集

    回答ありがとうございます。

    ただ、その場合だとZドライブが割り当ててある場合どうしても切断出来ない
    ようでした。

    キャンセル

  • 2018/04/26 20:30

    私の環境(Windows 10 Pro 64bit)では私のコードもttyp03さんのコードも正常に動作しました(ファイル等を開いていても強制切断)

    ionnさんの環境が特殊な可能性は無いでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBScript

    212questions

    VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。