首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >映射网络驱动器,而无需在批处理文件中硬编码驱动器号

映射网络驱动器,而无需在批处理文件中硬编码驱动器号
EN

Stack Overflow用户
提问于 2010-09-15 17:40:23
回答 7查看 78.7K关注 0票数 17

我需要使用批处理文件映射网络驱动器,但不想指定驱动器号。

批处理文件用作部署过程的一部分;我从CruiseControl.Net调用批处理文件,批处理文件需要映射需要凭据才能进行身份验证的UNC路径。然后,批处理文件调用RoboCopy将网站从输出目录部署到目标目录(并排除一些文件和文件夹)。最后,批处理删除网络驱动器。

问题是,这是不可扩展的,当只有几个项目时,这是很好的,但我们现在已经有20个项目使用这种方法,并且正在用完要映射的驱动器号。我不想重复使用驱动器号,因为它们可能会发生冲突-这将是不好的。

以下是批处理文件的示例:

代码语言:javascript
复制
@echo off
net use x: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" x:\ *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use x: /delete

并为可读性设置格式:

代码语言:javascript
复制
@echo off
net use x: \\192.168.0.1\Share\wwwroot\MyProject 
    /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" x:\ *.* /E /XO /XD 
    "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use x: /delete
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-15 18:03:59

如果您没有同时连接多个网络共享,您可以让net use *为您分配一个空闲的驱动器号。之后,您可以使用robocopy通过其UNC路径访问共享,并使用net use * /delete释放任何连接的共享。

如下所示:

代码语言:javascript
复制
@echo off
net use * \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" "\\192.168.0.1\Share\wwwroot\MyProject" *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use * /delete /yes

编辑:

正如我从一些研究中了解到的那样,您可以简单地映射共享,而无需分配驱动器号。然后,仅通过其远程UNC路径对其进行匿名映射。通过这种方式,您还可以通过仅指定映射的远程名称来删除映射。

这应该是可行的:

代码语言:javascript
复制
@echo off
net use \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd
robocopy.exe "W:\wwwroot\MyProject" "\\192.168.0.1\Share\wwwroot\MyProject" *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP
net use \\192.168.0.1\Share\wwwroot\MyProject /delete
票数 35
EN

Stack Overflow用户

发布于 2012-01-25 22:19:39

我使用此命令让NET选择一个空闲的驱动器号,然后使用NET找出它分配的驱动器号:

代码语言:javascript
复制
net use * \\server\share
for /f "tokens=2" %%i in ('net use ^| find "\\server\share"') do set netdrive=%%i
echo %netdrive% has been mapped
票数 11
EN

Stack Overflow用户

发布于 2013-12-18 22:42:58

有些人可能会发现以下批处理文件很有用。

它不依赖于外部程序。

批处理文件包含一个函数:freedrive,该函数查找可用驱动器号并将其返回到变量中。它还会正确检测到没有介质的光驱占用驱动器盘符。

代码语言:javascript
复制
@echo off
setlocal

call :freedrive mydriveletter && goto :cont
echo ERROR: No free drive letter found.
goto :exit
:cont
echo Found drive letter: %mydriveletter%

goto :exit

rem Finds a free drive letter.
rem
rem Parameters:
rem     %1 = Output variable name.
rem
rem Example:
rem     call :freedrive mydriveletter && goto :cont
rem     echo ERROR: No free drive letter found.
rem     goto :EOF
rem     :cont
rem     echo Found drive letter: %mydriveletter%
:freedrive
setlocal EnableDelayedExpansion
set exitcode=0
set "output_var=%~1"
for %%i in (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
    set "drive=%%i:"
    rem If 'subst' fails, the drive letter is already in use.
    rem This way we can even detect optical drives that have a drive
    rem letter but no media in them, a case that goes undetected when
    rem using 'if exist'.
    subst !drive! %SystemDrive%\ >nul
    if !errorlevel! == 0 (
        subst !drive! /d >nul
        goto :freedrive0
    )
)
set exitcode=1
set drive=
:freedrive0
endlocal & set "%output_var%=%drive%" & exit /b %exitcode%

:exit
pause
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3716422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档