2

我有每次用户登录到其 Active Directory 域的工作站时运行的 logon.bat 脚本。

该脚本使用如下命令映射一些网络驱动器:

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

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

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

我见过其他脚本解决方案,它们只是将超时(或睡眠)放入批处理脚本,以便在运行 net use 命令之前等待任意时间。这些解决方案提供的等待常数要么“映射驱动器比它们可能被映射的时间晚一点”,要么“仍然冒着在网络建立之前运行 net-use 命令的风险”。

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

您如何在 Windows 批处理脚本中实现这一点?

4

3 回答 3

6

简单检查。一段时间后不会自动退出。为我需要的东西工作。

:CHECKFOLDER
TIMEOUT 1
IF NOT EXIST C:\TEST GOTO CHECKFOLDER
于 2017-07-01T13:43:11.757 回答
5

我关于如何从批处理文件中仅 ping 服务器一次的答案?和删除与网络驱动器关联的桌面快捷方式?包含此任务的有用信息。

这是 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,则此解决方案不起作用,因此工作站在其服务器 ping 上永远得不到答案。

于 2014-10-04T19:46:56.273 回答
2

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

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

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

这将强制计算机在运行启动/登录脚本之前等待网络启动。

于 2014-10-08T11:42:15.060 回答