Sim*_*tin 15 batch-file network-drive
我需要使用批处理文件映射网络驱动器,但不想指定驱动器号.
批处理文件用作部署过程的一部分; 我调用批处理文件CruiseControl.Net,批处理文件需要映射一个需要凭据进行身份验证的UNC路径.然后批处理文件调用RoboCopy将网站从输出目录部署到目标(并排除某些文件和文件夹).最后,批处理删除网络驱动器.
问题是这不是可扩展的,当只有少数项目时它很好但我们现在有20个项目使用这种方法并且用尽了驱动器号来映射.我不想重复使用驱动器号,因为它们可能会发生冲突 - 这很糟糕.
这是批处理文件的示例:
@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
Run Code Online (Sandbox Code Playgroud)
并格式化为可读性:
@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
Run Code Online (Sandbox Code Playgroud)
Fra*_*ack 32
如果您没有同时连接多个网络共享,则可net use *以为您分配一个免费的驱动器号.之后,您可以使用robocopy通过其UNC路径访问共享并释放任何已连接的共享net use * /delete.
像这样的东西:
@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
Run Code Online (Sandbox Code Playgroud)
编辑:
正如我从一些研究中了解到的那样,您可以简单地映射共享而无需分配驱动器号.然后通过其远程UNC路径匿名映射.这样,您还可以通过仅指定其远程名称来删除映射.
这应该工作:
@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
Run Code Online (Sandbox Code Playgroud)
lon*_*eck 11
我使用它来让NET选择一个免费的驱动器号,然后使用NET找出它分配的字母:
net use * \\server\share
for /f "tokens=2" %%i in ('net use ^| find "\\server\share"') do set netdrive=%%i
echo %netdrive% has been mapped
Run Code Online (Sandbox Code Playgroud)
有些人可能会发现以下批处理文件很有用
它不依赖于外部程序.
批处理文件包含一个函数:freedrive,该函数查找空闲的驱动器号并将其返回到变量中.它还可以正确检测没有媒体占用驱动器号的光驱.
@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69600 次 |
| 最近记录: |