0

我有logon.bat脚本,每次用户登录到他们的Active Directory域的工作站时运行。批处理脚本 - 等待,直到网络建立

这个脚本一些网络驱动器映射,像这样的命令:

net use x: \\192.168.0.2\share1 
net use y: \\192.168.0.3\share2 
net use z: \\192.168.0.4\share3 

然而,对于某些工作站,该脚本运行前的工作站本身已全面建立了自己的局域网连接。然后用户进入开始菜单>计算机,并查看每个映射驱动器的红色X.到此时,网络已经建立,所以如果他们点击红色的X,它就会消失。不过,我希望logon.bat脚本在运行net-use命令之前验证网络是否已建立。

我见过这样的解决方案,需要在组策略中更改设置或要求更改罪魁祸首工作站上的设置。但是,我对仅在我当前的批处理脚本中解决此问题的解决方案感兴趣(不需要该脚本之外的任何其他脚本依赖项)。

我见过其他脚本解决方案,它只是将超时(或睡眠)放入批处理脚本中,以便在运行net use命令之前等待一段任意时间。这些解决方案提供了等待常量,要么“映射驱动器的时间比他们映射的时间要晚得多”,要么“仍然存在早于网络建立时运行网络使用命令的风险”。

相反,我想要一个脚本来检查每一秒是否已建立网络,然后(成功时)继续运行前面提到的“net use”命令。

如何在Windows批处理脚本中实现此目的?

回答

1

简单的检查。持续时间后不会自动退出。为我所需要的工作。

:CHECKFOLDER 
TIMEOUT 1 
IF NOT EXIST C:\TEST GOTO CHECKFOLDER 
3

我在How to ping a server only once from within a batch file?Deleting Desktop Shortcuts Associated With Network Drives?的答案包含此任务的有用信息。

这里是1个服务器模板批处理脚本:

@echo off 
set "Server=192.168.0.2" 
set "RetryCount=0" 

:CheckServer 
rem Ping server only once with a time limit of 1000 ms. 
%SystemRoot%\System32\ping.exe -n 1 -w 1000 %Server% >nul 
if not errorlevel 1 goto MapDrive 

rem Connection to server is not yet established. Give up after 30 seconds 
rem in case of not being in right LAN or no network connection at all or 
rem this server is currently not running. 
set /A RetryCount+=1 
if not %RetryCount%==30 goto CheckServer 

echo There is no connection to server %Server%. 
echo The network drive X: is not available. 
goto :EOF 

:MapDrive 
echo Mapping network drive X: ... 
%SystemRoot%\System32\net.exe use X: \\%Server%\share1 /persistent:no >nul 

我必须补充一点,如果服务器上安装了防火墙运行此解决方案不起作用哪些块的ping服务器,因此工作站没有得到永远在服务器上回答一个问题。

1

您应该使用组策略首选项来映射网络驱动器,而不是批处理脚本,但是,如果坚持,在脚本中ping服务器不是正确的方法。

相反,你应该部署的组策略设置:

"Computer Configuration" -> "Administrative Templates" -> "System" -> "Logon" -> "Always wait for the network at computer startup and logon" 

这将迫使计算机等待网络运行启动/登录脚本之前就上来了。