Есть два или даже три вопроса.
Первый - 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 решения этой проблемы.
Первый используются команда чистое использование:
%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?
Благодарим вас за подробное объяснение! Решение состояло в том, чтобы сопоставить общий ресурс в пакетном файле с использованием сети. Отлично! – HansDampfHH