我想在 Windows 中从 sleep 状态恢复后运行批处理文件。
如果我在命令行上启动批处理文件,一切都会按预期进行。
但是批处理脚本没有按计划任务正常运行。
我做了什么:
外部配置文件 AutoMountConf.bat
包含 set Pass = Test
本地脚本文件scheduleTask.bat
包含
rem AutoMountConf.bat is in my intranet.
call X:\AutoMountConf.bat
start "" "C:\Program Files\TrueCrypt\TrueCrypt.exe" /auto favorites /p %Pass% /q
在命令行上安装了 TrueCrypt 容器。 如果我从计划任务运行脚本,我会看到登录屏幕以手动输入密码。
最佳答案
有两个甚至三个问题。
第一个是 set Pass = Test
而不是 set "Pass=Test"
正如 Stephan 已经报道的那样。有关如何为环境变量赋值的更多详细信息,请参阅我在 Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的回答
第二个问题是由于网络驱动器一旦被用户映射到驱动器盘符并被 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/?
以获得有关必需选项和 optional 的详细信息。 /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,则命令执行成功。远程机器当前在网络上不可用的情况总是会发生,因此最好检查连接是否成功以在远程机器上共享。
运行 AutoMountConf.bat
后未定义 Pass
的原因可能还有一个。
AutoMountConf.bat
包含 setlocal 并且变量 Pass
是在执行此命令之后和 endlocal 之前定义的在同一个批处理文件中执行,或在退出 AutoMountConf.bat
时由命令处理器隐式调用。
setlocal 导致始终创建现有环境变量的副本,并且对环境变量的所有修改都在该本地副本上完成。之前的环境变量在执行(匹配的)endlocal 时或在批处理文件结束时恢复,在这种情况下,命令处理器会自动恢复之前的环境。
请在命令提示符窗口中执行 setlocal/?
并阅读输出帮助。
有关通过命令 setlocal 和 endlocal 了解环境管理的示例,也许甚至更好地查看 Echoing a URL in Batch 和 Why is my cd %myVar% being ignored? 上的答案
关于windows - 从外部文件中读取变量无法按计划任务运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556805/