【问题标题】:Mapping a network drive and checking for its existence in VBScript在 VBScript 中映射网络驱动器并检查其是否存在
【发布时间】:2011-09-07 15:42:37
【问题描述】:

我需要使用 VBScript 将网络驱动器映射到网络路径。网络路径直接从输入中读取。应该如何映射网络驱动以及如何检查输入的网络路径是否已经存在?

【问题讨论】:

    标签: vbscript network-drive mapped-drive


    【解决方案1】:

    我创建了一个子程序来映射驱动器...

        MapDrive "H:","\\server\share"
    
        Sub MapDrive(letter, uncpath)
             on error Resume Next
             dim drivetype, currentmapping
    
            dim objWMIService 
            dim colDisks, objDisk
    
            'Set wshnetwork = CreateObject("Wscript.Network")
            Set objWMIService = GetObject("winmgmts:" & _
                 "{impersonationLevel=impersonate}!\\.\root\cimv2")
            Set colDisks = objWMIService.ExecQuery _
                ("Select * from Win32_LogicalDisk Where Name = """ & letter & """")
            For Each objDisk In colDisks        
                 drivetype = objDisk.DriveType      
                currentmapping = objDisk.ProviderName
            Next    
    
    
            if (drivetype <> 4 and drivetype <> 0) then
                NotifyUser ucase(letter) & " cannot be mapped due to a physical device already reserving that drive letter" & vbcrlf & _
                            "This is most frequently caused by a thumbdrive or external disk.",5
                exit Function
            end if
    
            if (ucase(currentmapping) = ucase(uncpath)) then
                exit function
            end If
    
            if (drivemappings.Exists(uncpath)) then
                drivemappings.Add uncpath & "(" & letter & ")", letter
            else 
                drivemappings.Add uncpath, letter
            end if
    
            if (currentmapping <> "") then
                    wshnetwork.RemoveNetworkDrive letter,,True
            end if
    
            wshnetwork.MapNetworkDrive letter, uncpath, true
    
            on Error goto 0
         End Sub
    

    我让你来处理错误检查等。或者,如果你更喜欢网络使用路线,你可以做类似的事情..

    dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
    wshshell.run "cmd /c net use H: ""\\server\share""",1,True
    

    您可以更进一步,使用创建的示例The Scripting Guys 自动使用下一个可用驱动器号映射驱动器。

    Set objDictionary = CreateObject("Scripting.Dictionary")
    
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    
    Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
    
    For Each objDisk in colDisks
        objDictionary.Add objDisk.DeviceID, objDisk.DeviceID
    Next
    
    For i = 67 to 90
        strDrive = Chr(i) & ":"
        If objDictionary.Exists(strDrive) Then
        Else
            Wscript.Echo strDrive & " is the next available drive letter."
            Wscript.Quit
        End If
    Next
    Wscript.Echo "There are no available drive letters on this computer.”
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      在您的 vbscript 文件中运行以下命令:

      net use [NetDrive:] [Network Path]
      

      例如:

      net use Z: \\Hadi\temp
      

      示例命令会将 \Hadi\temp 映射到 Z:

      还可以查看用于映射网络驱动器的this VBScript 文件。

      【讨论】:

        【解决方案3】:

        我自己不是 WMI 的忠实拥护者(它有点臃肿且速度慢),所以我使用以下代码将网络共享映射到第一个可用的驱动器号并检查它是否已成功安装:

        Dim strScriptPath, strMapNetworkDriveLetter
        strScriptPath = Left(WScript.ScriptFullName, Len(WScript.ScriptFullName) - Len(WScript.ScriptName)-1) 
        strMapNetworkDriveLetter = GetFirstFreeDriveLetter & "\"
        
        Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
        
        strScriptPath = RemoveTrailingBackslash(strScriptPath)
        
        If Left(strScriptPath, 2) = "\\" Then
            ' Create Drive Mapping
            Dim WshNetwork
            Set WshNetwork = WScript.CreateObject("WScript.Network")
        
            WshNetwork.MapNetworkDrive RemoveTrailingBackslash(strMapNetworkDriveLetter), strScriptPath
            If objFSO.DriveExists(strMapNetworkDriveLetter) Then
                Dim objDrives, boolMapNetworkDrive, i
                Set objDrives = WshNetwork.EnumNetworkDrives
                boolMapNetworkDrive = False
                For i = 0 to objDrives.Count - 1 Step 2
                    WScript.Echo "[debug] " & objDrives.Item(i) & " = " & objDrives.Item(i+1)
                    If objDrives.Item(i) = RemoveTrailingBackslash(strMapNetworkDriveLetter) Then
                        If objDrives.Item(i+1) = strScriptPath Then
                            WScript.Echo "[debug] Drive " & objDrives.Item(i) & " is now connected to " & objDrives.Item(i+1) & vbCrLf
                            boolMapNetworkDrive = True
                            Exit For
                        End If
                    End If
                Next
            End If
            
            If Not boolMapNetworkDrive Then
                ShowMessage("The network connection (" & strScriptPath & ") could not be found.")
                WScript.Quit(2)
            End If
        End If
        
        ' Do your stuff here...
        
        ' Unmount UNC Drive Mapping after script execution.
        If boolMapNetworkDrive Then
            WScript.Echo("WshNetwork.RemoveNetworkDrive " & RemoveTrailingBackslash(strMapNetworkDriveLetter))
            WshNetwork.RemoveNetworkDrive RemoveTrailingBackslash(strMapNetworkDriveLetter), True
            If objFSO.DriveExists(strMapNetworkDriveLetter) Then
                WScript.Echo("Error on WshNetwork.RemoveNetworkDrive.")
                WScript.Quit(3)
            End If
        End If
        
        Function GetFirstFreeDriveLetter
         
            Dim objFSO, strLetters, i,  blnError 
            Set objFSO = CreateObject("Scripting.FileSystemObject") 
             
            '* list of possible drive letters 
            '* A and B are reserved for floppy disc 
            '* you may limit the search using any subset of the alphabet 
            strLetters = "CDEFGHIJKLMNOPQRSTUVWXYZ"  
            GetFirstFreeDriveLetter = "" 
            blnError = True 
             
            '* walk through all possible drive letters 
            For i=1 to len(strLetters) 
            '* if the drive letter isn't in use the it's ours 
                If not objFSO.DriveExists(mid(strLetters, i, 1) & ":") Then 
                    '* we have found a free drive letter, therefore blnError = False 
                    blnError = False 
                    '* assigning the return value 
                    GetFirstFreeDriveLetter = mid(strLetters, i, 1) & ":" 
                    '* we want to find the FIRST free drive letter 
                    Exit For 
                End If 
            Next  
             
            '* error handling 
            If blnError then  
                WScript.Echo "Error - no free drive letter found!"  
                WScript.Quit(1)
            End If 
             
            '* releasing file system object 
            Set objFSO = Nothing 
         
        End Function 
        
        Function RemoveTrailingBackslash(strString)
            If Right(strString, 1) = "\" Then
                RemoveTrailingBackslash = Left(strString, Len(strString)-1)
            Else
                RemoveTrailingBackslash = strString
            End If
        End Function
        

        【讨论】:

          猜你喜欢
          • 2015-01-30
          • 2016-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-09
          相关资源
          最近更新 更多