我希望在Windows中从睡眠状态恢复后运行批处理文件。
如果我在命令行上启动批处理文件,一切都按预期工作。
但批处理脚本无法按计划任务正常运行。
我做了什么:
外部配置文件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容器。 如果我从计划任务运行脚本,我会在登录屏幕上手动输入密码。
答案 0 :(得分:2)
有两个甚至三个问题。
第一个是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不允许这样做。因此,必须在批处理文件中手动连接和断开网络共享。我为这个问题提供了两种解决方案。
第一个是使用命令 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存储加密任务的密码,就像存储用户帐户本身一样。
在命令提示符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
表示如果上一个命令退出NOT值大于或等于1,则表示前一个命令的退出代码为0,因此命令执行成功。总是可能发生远程机器当前在网络上不可用,因此检查连接到远程机器上的共享是否成功总是好的。
运行Pass
后,可能还有一个原因导致AutoMountConf.bat
未定义。
AutoMountConf.bat
包含 setlocal ,并且在执行此命令之后以及在同一批处理文件中执行 endlocal 之前或隐式地定义变量Pass
退出AutoMountConf.bat
时命令处理器调用。
setlocal 会导致始终创建现有环境变量的副本,并且对此环境变量的所有修改都在此本地副本上完成。在执行(匹配) endlocal 时会恢复以前的环境变量,或者在达到批处理文件的末尾时,命令处理器会自动恢复以前的环境。
请在命令提示符窗口setlocal /?
中执行并阅读输出帮助。
有关通过命令 setlocal 和 endlocal 了解环境管理的示例,或许更好地查看Echoing a URL in Batch和Why is my cd %myVar% being ignored?上的答案
答案 1 :(得分:0)
set Pass = Test
使用内容pass<space>
设置变量<space>Test
。所以%pass%
保持空白。
使用此语法:
set "Pass=Test"
避免任何意外的空间。