用vbs找到對映到共享的所有驅動器並重新對映它們

2022-09-21 22:48:23 字數 2681 閱讀 5253

問:

您好,指令碼專家!如何找到對映到 \\server1\share 的所有啟動器,並將它們重新對映到 \\server2\share?

-- h t-s

答: 你好,h t-s。您知道,不久前 malcolm gladwell 出版了一本書,書名為《the tipping point》。簡單來說,該書做出了一種假設:某一事物可能在很長一段時間內被忽略,但是當這種忽略至少達到所謂的引爆點時,這個原來無人問津的事物就會忽然變程式設計客棧成一種名副其實的時尚。就好像一夜之間它就從一件您從未聽說的事物變得似乎隨處可見。

這是個有趣的假設,我們似乎在用於對映和取消對映網路驅動器的指令碼上看到了這種現象。我們發布「您好,指令碼專家!」專欄已經一年多了,而從未提及網路驅動器,並且似乎沒有人注意這個問題。然後,突然之間,關於對映和取消對映網路驅動器的問題紛至沓來。我們在幾周前回答了第乙個這種問題,現在又來回答另乙個問題,我們有乙個收件箱全都是其他關於網路驅動器的問題。先是呼啦圈,然後是喇叭褲,現在輪到網路驅動器了。自己去想吧。

那麼重新對映網路驅動器如何呢?嗯,不論是好是壞,並沒有可以自動重新對映網程式設計客棧絡驅動器的方法;因此,我們不得不退而求其次找出其他解決方法。但這並不是太槽糕:我們可以找到符合條件的所有驅動器,取消對映這些驅動器,然後將每個驅動器重新對映到新的位置。 

當然,這聽起來挺複雜,但實際上很簡單。以下指令碼可用來查詢對映到 \\server1\share 的所有驅動器,並將這些驅動器重新對映到 \\se

set objnetwork = createobject("wscript.network")

set coldrives = objnetwork.enumnetworkdrives

for i = 0 to coldrives.count-1 step 2

if coldrives.item(i + 1) = "\\server1\share" then

strdriveletter = coldrives.item(i)

objnetwork.removenetworkdrive strdriveletter

objnetwork.mapnetworkdrive strdriveletter, "\\server2\share"

end if

next

該指令碼將首先建立 wscript.network 物件例項。我們應當注意到了,無論何時當我們要對映或取消對映網路驅動器時,都需要使用 windows script host,這是因為 wmi 沒有任何對映或取消對映驅動器的方法。沒關係,這只不過意味著我們的指令碼必須在本地計算機上執行。通常情況下都不能針對遠端計算機來使用 wsh 方法。這是乙個您不得不面臨的限制。(有乙個方法可解決此問題:將該指令碼作為登入指令碼執行。登入指令碼將始終在本地執行。)

建立 network 物件之後,呼叫 enumnetworkdrives 方法,以便返回計算機上的所有已對映網路驅動器的集合:

set coldrives = objnetwork.enumnetworkdrives

這將使我們親眼見到那個被稱為已對映網路驅動器集合的奇特的小東西。今天我們就不詳細介紹此集合的體系結構了,請參閱關於網路驅動器的上乙個專欄。只需說明每個已對映的驅動器實際占用此集合中的兩項:第一項為驅動器號,第二項為 unc 路徑。如果計算機上有三個已對映的驅動器,則集合內容將如下所示:

x: \\server1\share1

y: \\server2\share2

z: \\server3\share3

這就是我們必須使用看起來這麼奇怪的 for next 迴圈來遍歷集合的原因,此**行使我們在集合中每隔一項就跳過一項,進而確保我們僅檢視各個驅動器號項:

for i = 0 to coldrives.count-1 step 2

然後,對於每個驅動器號,我們需要確定相應的 unc 路徑是否為 \\server1\share1。請記住,如果檢視集合中的 0 項(集合中的第一項的索引號為 0),則看到的是驅動器號,相應的 unc 路徑將為該索引號 (0) 加 1。因此,我們用如下**來確定第乙個驅動器是否正好被對映到 \\server1\share1:

if coldrives.item(i + 1) = "\\server1\share" then

讓我們假定就是這樣。在這種情況下,我們需要獲取驅動器號(0 項),並將該值儲存在名為 strdriveletter 的變數中。然後,呼叫 removenetworkdrive 方法來取消對映該驅動器,再呼叫 mapnetworkdrive 方法將同一驅動器號重新對映到新的共享:

objnetwork.mapnetworkd strdriveletter, "\\server2\share"

不,這並不是所謂的「引爆點」,因為您剛剛推翻了試圖遵循這一切的想法。我們知道是有點混亂,但這是由於已對映網路驅動器集合的特殊構造方式而造成的。如果這對於您沒有任何意義,儘管忽略它好了,您應當看到事情整體上是有邏輯性的。也許,是有點混亂的邏輯,但仍然是邏輯。

因為這一點比較費解,所以我們舉了乙個最簡單的例子:將名為 \\server1\share 的共享重新對映到名為 \\server2\share 的共享。當然還可以將 server1 上的任何共享重新對映到 server2 上任何名稱相似的共享。但是這對於今天來說可能有點過多了。但是,如果您感興趣,只需要讓我們知道,我們會在不久以後重新關注此主題。

本文標題: 用vbs找到對映到共享的所有驅動器並重新對映它們

本文位址: /ruanjian/vb/36161.html

如何把網路共享目錄對映為本地驅動器

要對映乙個網路目錄為本地驅動器,需要呼叫系統 dll的 wnetaddconnection2 函式來進行新增。首先,系統函式的申明如下 using system.runtime.interopservices dllimport mpr.dll entrypoint wnetaddconnectio...

域登入延遲對映驅動器的指令碼

on error resume next 定義shell物件 dim wshshell set wshshell createobject wscript.shell 延時3分鐘 wscript.sleep 180000 定義網路物件 dim ws set ws createobject wscri...

如何把網路共享目錄對映為本地驅動器(續)

有人對原來寫的那篇文章提出了更深的問題,就是在不知道網路驅動器碟符的情況下,如何進行刪除。起始要獲得驅動器的碟符也不是件很複雜的事情,只要向 wmi進行查詢即可,大致的方法如下。首先,要在工程中引用 windows.management 然後,就是用 wmi進行查詢,如下 public enum d...