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

4

2 回答 2

2

有两个甚至三个问题。

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

第二个是使用命令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表示如果上一个命令退出时的值不是大于或等于 1,这意味着如果上一个命令的退出代码为 0,因此命令执行成功。远程计算机当前在网络上不可用的情况总是会发生,因此最好检查连接到远程计算机上的共享是否成功。


Pass运行后未定义的原因可能还有一个AutoMountConf.bat

AutoMountConf.bat包含setlocal并且变量Pass是在执行此命令之后和endlocal在同一批处理文件中执行之前定义的,或者在退出时由命令处理器隐式调用AutoMountConf.bat

setlocal导致始终创建现有环境变量的副本,并且对环境变量的所有修改都在此本地副本上完成。以前的环境变量在执行(匹配的)endlocal或到达批处理文件的末尾时恢复,在这种情况下,命令处理器会自动恢复以前的环境。

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

有关通过命令setlocalendlocal了解环境管理的示例,也许更好地查看有关Echoing a URL in BatchWhy is my cd %myVar% being ignored 的答案?

于 2016-01-01T16:15:22.533 回答
0
set Pass = Test

pass<space>使用 Content设置一个变量<space>Test。所以%pass%一直空着。

使用这个语法:

set "Pass=Test"

以避免任何意外的空间。

于 2016-01-01T14:13:14.117 回答