2016-01-01 6 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" как указано 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?

+0

Благодарим вас за подробное объяснение! Решение состояло в том, чтобы сопоставить общий ресурс в пакетном файле с использованием сети. Отлично! – HansDampfHH

0
set Pass = Test 

устанавливает переменную pass<space> с содержанием <space>Test. Таким образом, %pass% остается пустым.

использовать этот синтаксис:

set "Pass=Test" 

, чтобы избежать каких-либо непредвиденных пробелов.

+0

Это не решает проблему. Такая же проблема с задачей расписания Windows. Выполнено только выполнение командной строки. – HansDampfHH

+0

уверены, что '% pass%' определяется в запланированной задаче? – Stephan