有两个甚至三个问题。
第一个set Pass = Test
不是斯蒂芬已经报道的set "Pass=Test"
那样。有关如何为环境变量分配值的更多详细信息,请参阅我在命令行上使用 'set var = text' 后为什么没有带有 'echo %var%' 的字符串输出?
第二个问题是由于一旦用户将网络驱动器映射到驱动器号并由 Windows 在注册表中记住的事实,在用户注销时 Windows 会自动断开连接,并且只有在同一用户再次登录时才会重新连接。
因此,对于计划任务,经常需要对网络中共享文件夹上的文件和文件夹使用 UNC 路径,或者在作为计划任务执行的批处理文件中连接网络驱动器并断开它。
无法调用具有 UNC 路径的批处理文件。Windows 不允许这样做。因此需要在批处理文件中手动连接和断开网络共享。我为这个问题提供了 2 个解决方案。
第一个是使用命令net use:
%SystemRoot%\System32\net.exe use X: \\ComputerName\ShareName password /user:Domain\UserName /persistent:no
if not errorlevel 1 (
call X:\AutoMountConf.bat
%SystemRoot%\System32\net.exe use X: /delete
start "" /wait "C:\Program Files\TrueCrypt\TrueCrypt.exe" /auto favorites /p %Pass% /q
)
password
并且/user:Domain\UserName
仅当未使用有权访问远程计算机上的批处理文件的用户帐户执行计划任务时才需要。通常,使用正确的用户帐户定义计划任务并确保该帐户的密码与任务一起安全得多。Windows 存储加密任务的密码,就像它也为用户帐户本身一样。
在命令提示符窗口中运行以net use /?
获取有关必需选项和可选选项的详细信息。/persistent:no
是避免记住 Windows 注册表中的网络共享,以便在同一用户登录后自动重新连接。
第二个是使用命令pushd和popd:
pushd \\ComputerName\ShareName
if not errorlevel 1 (
call AutoMountConf.bat
popd
start "" /wait "C:\Program Files\TrueCrypt\TrueCrypt.exe" /auto favorites /p %Pass% /q
)
请在命令提示符窗口中执行pushd /?
并阅读输出帮助以了解其工作原理。
但此解决方案要求用于计划任务且密码正确的用户帐户是对远程计算机上的共享具有适当权限的用户帐户。此解决方案无法在批处理文件本身中指定密码和用户名。
if not errorlevel 1
表示如果上一个命令退出时的值不是大于或等于 1,这意味着如果上一个命令的退出代码为 0,因此命令执行成功。远程计算机当前在网络上不可用的情况总是会发生,因此最好检查连接到远程计算机上的共享是否成功。
Pass
运行后未定义的原因可能还有一个AutoMountConf.bat
。
AutoMountConf.bat
包含setlocal并且变量Pass
是在执行此命令之后和endlocal在同一批处理文件中执行之前定义的,或者在退出时由命令处理器隐式调用AutoMountConf.bat
。
setlocal导致始终创建现有环境变量的副本,并且对环境变量的所有修改都在此本地副本上完成。以前的环境变量在执行(匹配的)endlocal或到达批处理文件的末尾时恢复,在这种情况下,命令处理器会自动恢复以前的环境。
请在命令提示符窗口中执行setlocal /?
并阅读输出帮助。
有关通过命令setlocal和endlocal了解环境管理的示例,也许更好地查看有关Echoing a URL in Batch和Why is my cd %myVar% being ignored 的答案?