2016-01-01 23 views
1

我想在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的容器安装。 如果我从计划任务运行脚本,我会获得登录屏幕以手动输入密码。

回答

2

有两个甚至三个问题。

第一个是set Pass = Test而不是set "Pass=Test",因为已经报告了。有关如何将值权分配给环境变量的更多详细信息,请参阅Why is no string output with 'echo %var%' after using 'set var = text' on command line?


我回答第二个问题是由网络驱动器,一旦用户到驱动器盘符映射,并在注册表想起造成的事实由Windows在用户注销时会自动断开连接,并且只有在同一用户再次登录时才会重新连接。

对于计划任务是非常因此经常需要使用的文件和文件夹的UNC路径上的共享文件夹的网络或连接网络驱动器,并在自己的计划任务执行的批处理文件断开。

无法使用UNC路径调用批处理文件。 Windows不允许这样做。因此,需要在批处理文件中手动连接和断开网络共享。我为这个问题提供了2个解决方案。

第一种是使用命令网使用:只有在计划任务无法与具有的权限来访问该批处理文件的用户帐户执行

%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注册表中的网络共享以便在同一用户登录后自动重新连接。

第二个是使用命令PUSHDPOPD

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并执行该命令后,变量Pass定义和ENDLOCAL之前在同一批处理文件被执行或由命令处理器隐含调用在离开AutoMountConf.bat

SETLOCAL结果在创造总是复制现有的环境变量和环境变量的所有修改都在这个本地副本完成。在执行(匹配)endlocal时或者在达到批处理文件结束时会恢复以前的环境变量,在这种情况下,命令处理器会自动恢复以前的环境。

请在命令提示符窗口setlocal /?中执行并阅读输出帮助。

为例子来理解的命令上Echoing a URL in BatchSETLOCALENDLOCAL甚至更​​好看答案和Why is my cd %myVar% being ignored?

+0

感谢您的详细解释! 解决的办法是将批处理文件中的共享手册映射为网络使用。 完美! – HansDampfHH

0
set Pass = Test 

将变量pass<space>与内容<space>Test。所以%pass%保持空。

使用此语法:

set "Pass=Test" 

,以避免任何意外的空间。

+0

这并不是解决问题的环境管理。与Windows日程安排任务相同的问题。只有命令行执行工作。 – HansDampfHH

+0

你确定,'%pass%'是在定时任务中定义的吗? – Stephan