Чтобы сделать то, что вы хотите, вам нужно сохранить текущие сопоставления. Я бы сделал это в переменных массива, таких как $MAP[1]
, $MAP[2]
, например. Поскольку атрибут Caption
всегда выглядит как буква диска плюс двоеточие, а атрибут ProviderName
всегда выглядит как UNC-путь, переменная $MAP[1]
может содержать что-то вроде <Caption>|<ProviderName>
.
Итак, давайте установим два отдельных цикла, где первый выполняет удаление и хранение данных, а второй выполняет действия по переназначению - например, так:
@echo off
set "SERVER=srv1"
rem // Initialise index counter:
set /A "COUNT=0"
rem /* Capture output of the `wmic` command line that is filtered by a `where` clause;
rem this returns only the drives, filtered for network drives (`DriveType=4`);
rem two nested loops avoid text conversion artefacts like orphaned CR marks: */
for /F "delims=" %%K in ('
wmic LogicalDisk where "DriveType=4 and ProviderName like '\\\\%SERVER%\\%%'" get DeviceID /VALUE
') do for /F "tokens=1* delims==" %%I in ("%%K") do (
rem /* Capture output of the `wmic` command line that returns the mapping target
rem that corresponds with the current drive: */
for /F "delims=" %%G in ('
wmic LogicalDisk where "DeviceID='%%J'" get ProviderName /VALUE
') do for /F "tokens=1* delims==" %%E in ("%%G") do (
rem // Increment index counter:
set /A "COUNT+=1"
rem // Revert handling of `&` by `wmic`, hence replace `&` by `&`:
set "NAME=%%F" & call set "NAME=%%NAME:&=&%%"
rem /* Store current mapping into array-like variable;
rem `call` and double-`%` in `%%COUNT%%` are necessary as `COUNT` is modified
rem and read within the same block of code (`%COUNT%` would return `0`): */
call set "$MAP[%%COUNT%%]=%%J|%%NAME%%"
rem // Delete the current mapping:
ECHO net use %%J /DELETE
)
)
rem // Loop over all array elements:
for /F "tokens=1-2* delims=|=" %%H in ('2^> nul set $MAP[') do (
rem // Establish remapping with new user data:
ECHO net use %%I "%%J" pwd /USER:dom/uid1
rem // Delete handled array element:
set "%%H="
)
Конечно, сначала вам нужно установить и адаптировать переменную фильтра SERVER
(используется для предложения where
, которое заменяет вашу команду find
). Я изменил строку поиска на \\%SERVER%\
, поэтому сопоставляются только полные имена серверов.
Этот подход правильно обрабатывает сетевые пути, содержащие ПРОБЕЛЫ и амперсанды (&
).
Чтобы действительно удалить и переназначить удаленные пути, удалите команды ECHO
в верхнем регистре.