Вопрос или проблема
У меня есть пакетный файл, который всего лишь состоит из 3 строк.
Что он делает, довольно просто:
type C:\data\file.bak >> echo "" >> file.log.bak
cscript "C:\data\Move filesA.vbs"
cscript "C:\data\Move filesB.vbs"
В основном он просто берет file.bak и добавляет его в file.log.bak. Это обычные текстовые файлы.
Скрипты перемещают file.bak на серверное расположение.
Строка type C:\data\file.bak >> echo "" >> file.log.bak
была добавлена всего несколько часов назад. Скрипт выполняется каждые 15 минут.
Когда его запускает пользователь (двойным кликом по .bat файлу), он работает нормально и копирует файл в file.log.bak без проблем.
Когда он запускается из задания, строка type C:\data\file.bak >> echo "" >> file.log.bak
не выполняется, но выполняются cscripts.
Единственная моя догадка – это то, что в Windows есть кэшированная версия пакетного файла, и он не выполняет новый пакетный файл.
Есть ли какие-либо подсказки относительно того, почему строка type C:\data\file.bak >> echo "" >> file.log.bak
не выполняется при запуске из запланированного задания?
Убедитесь, что запланированное задание запускается в директории.
При использовании относительных путей к файлам это не сработает, если запускать из другой директории. Microsoft добавила функцию, которая берет команду и выполняет ее в другом месте, а не в том, где находится файл.
Дважды щелкните на запланированном задании (или нажмите свойства), перейдите на вкладку “Действия”, затем отредактируйте действие(я). Оттуда вы увидите всплывающее окно с полем “Запустить в (необязательно)”. Укажите директорию, в которой находится скрипт (или в какой директории вы хотите его запускать).
Ответ или решение
Если у вас возникла проблема с выполнением пакетного файла из запланированной задачи в Windows Server 2012, с вероятными трудностями в запуске инструкции type
, давайте рассмотрим возможные причины и решения, чтобы помочь вам разобраться в этой ситуации.
1. Причины проблемы
a) Различия в контексте выполнения
Когда вы запускаете пакетный файл вручную (дважды щелкнув на нем), он выполняется в контексте вашей сессии пользователя. Однако, когда его запускает Планировщик задач, он может использовать другую учетную запись или даже системную учетную запись (например, Local System). Это может повлиять на доступ к файлам и папкам.
b) Путь выполнения
Если ваш пакетный файл зависит от относительных путей, важно указать абсолютный путь к директории, в которой он должен выполняться. Поскольку контекст выполнения не всегда совпадает с местом расположения файла, это может привести к сбоям в выполнении команд.
c) Права доступа
Убедитесь, что учетная запись, используемая для выполнения запланированной задачи, имеет достаточные права доступа для чтения и записи в файлы и каталоги, к которым обращается пакетный файл.
2. Решения
a) Указание рабочей директории
Как упоминалось, когда вы редактируете задачу в Планировщике, укажите поле "Start in (optional)" с путем к директории, где находится ваш пакетный файл. Это обеспечит, что все команды выполняются именно из той директории, где вы ожидаете.
- Откройте Планировщик задач.
- Найдите вашу задачу и откройте её свойства.
- Перейдите на вкладку Actions (Действия).
- Выберите действие, нажмите Edit (Изменить).
- В поле "Start in" укажите путь к директории, в которой находится ваш пакетный файл.
b) Проверка прав доступа
Перейдите в свойства файлов и папок и убедитесь, что учетная запись, используемая для запланированной задачи, имеет доступ к C:\data\file.bak
, C:\data\Move filesA.vbs
и C:\data\Move filesB.vbs
. При необходимости предоставьте соответствующие права.
c) Запись журналов для отладки
Добавьте в ваш пакетный файл команды для записи в журнал выполнения, чтобы отслеживать, на каком шаге возникает проблема. Например, добавьте строки для записи вывода и ошибок в отдельный файл:
@echo off
echo >> C:\data\log.txt "Запуск скрипта: %date% %time%"
type C:\data\file.bak >> C:\data\file.log.bak 2>> C:\data\log.txt
if %errorlevel% neq 0 echo Ошибка при выполнении type >> C:\data\log.txt
cscript "C:\data\Move filesA.vbs" >> C:\data\log.txt 2>> C:\data\log.txt
cscript "C:\data\Move filesB.vbs" >> C:\data\log.txt 2>> C:\data\log.txt
3. Проверка кэша
Хотя вероятность того, что Windows использует кэшированную версию пакетного файла, крайне мала, вы можете попробовать создать новый пакетный файл с другим именем для тестирования. Это исключит возможность проблем с кэшированием.
Заключение
Проблема с выполнением пакетного файла из запланированной задачи может исходить из различных факторов, связанных с контекстом, правами доступа или путями выполнения. Следуя описанным выше шагам, вы сможете диагностировать и устранить проблему, обеспечив правильное выполнение вашего скрипта. Если после всех предпринятых усилий проблема останется, рекомендуется проверить журналы событий Windows на наличие дополнительных подсказок.