Указание директории для запуска в команде schtasks в windows - PullRequest
20 голосов
/ 20 июня 2009

Я понимаю, что на этот вопрос "ответили" в следующей ветке: Указание рабочего каталога для запланированных задач с помощью schtasks.exe

Однако мне все еще трудно понять ответ и точно определить, как будет выглядеть результат для моей ситуации.

Моя команда schtasks выглядит так:

Schtasks /Create /TR "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" /SC WEEKLY /TN mytask

Я хочу указать начало в каталоге "C: \ My Library". Помещение "\" до того, как раздел tr заполнит начальный каталог "C: \ Program Files \ Java \ jre6 \ bin".

Я много с этим возился, но я просто не могу заставить его работать.

Ответы [ 9 ]

14 голосов
/ 20 июня 2009

Не уверен, в какой версии Windows вы работаете, но, прочитав другой вопрос, похоже, что в задачах на Vista / Server 2008 нет опции команды, которая позволяла бы вам указывать каталог «запуска» напрямую. Были предоставлены следующие обходные пути:

  1. Используйте флаг / v1 для создания задачи, совместимой с XP / 2003, и в этом случае автоматически устанавливается каталог «запуск». Не уверен, что он установлен, но я подозреваю, что это может быть тот же каталог, что и исполняемый файл вашей задачи, который не будет работать для вас.
  2. Создайте свою задачу из файла XML (с помощью параметра / XML), который позволяет вам указать каталог для запуска. Извините, я не знаю синтаксис / структуру этого XML-файла.
  3. Создайте свою задачу, используя пользовательский интерфейс планировщика задач.
12 голосов
/ 24 ноября 2011

ОБНОВЛЕНИЕ: Обратите внимание, что начиная с Powershell v3 (но только под Windows 2012 и выше!) Появился новый API, который я считаю гораздо более привлекательным:

$taskPath = "\MyTasksFolder\"
$name = 'MyTask'
$runAt = '5:00 AM'
$exe = 'my.exe'
$params = 'command line arguments'
$location = "C:\Path\To\MyTask"

Unregister-ScheduledTask -TaskName $name -TaskPath $taskPath -Confirm:$false -ErrorAction:SilentlyContinue  

$action = New-ScheduledTaskAction –Execute "$location\$exe" -Argument "$params" -WorkingDirectory $location
$trigger = New-ScheduledTaskTrigger -Daily -At $runAt
Register-ScheduledTask –TaskName $name -TaskPath $taskPath -Action $action –Trigger $trigger –User 'someuser' -Password 'somepassword' | Out-Null

Решение Amal с переключателем /v1 великолепно, но не позволяет создавать задачи в пользовательских папках (т. Е. Вы не можете создать «MyCompany \ MyTask», и все заканчивается в корневой папке), так что я наконец-то оказался со сценарием PowerShell, описанным ниже.

Использование:

CreateScheduledTask -computer:"hostname-or-ip" `
                    -taskName:"MyFolder\MyTask" `
                    -command:"foo.exe" `
                    -arguments:"/some:args /here" `
                    -workingFolder:"C:\path\to\the\folder" `
                    -startTime:"21:00" `
                    -enable:"false" `
                    -runAs:"DOMAIN\user" `
                    -runAsPassword:"p@$$w0rd"

(Примечание: enable должен быть в нижнем регистре - для логического значения вам потребуется $value.ToString().ToLower())

Реализация:

Функция использует определение задачи XML и COM-объект "Schedule.Service".

#####################################################
#
#  Creates a Windows scheduled task triggered DAILY.
#  Assumes TODAY start date, puts "run-as" user as task author.
#
#####################################################
function CreateScheduledTask($computer, $taskName, $command, $arguments, $workingFolder, $startTime, $enable, $runAs, $runAsPassword)
{    
    $xmlTemplate = "<?xml version='1.0' encoding='UTF-16'?>
        <Task version='1.2' xmlns='http://schemas.microsoft.com/windows/2004/02/mit/task'>
          <RegistrationInfo>
            <Date>{0}</Date>
            <Author>{1}</Author>
          </RegistrationInfo>
          <Triggers>
            <CalendarTrigger>
              <StartBoundary>{2}</StartBoundary>
              <Enabled>true</Enabled>
              <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
              </ScheduleByDay>
            </CalendarTrigger>
          </Triggers>
          <Principals>
            <Principal id='Author'>
              <UserId>{1}</UserId>
              <LogonType>Password</LogonType>
              <RunLevel>LeastPrivilege</RunLevel>
            </Principal>
          </Principals>
          <Settings>
            <IdleSettings>
              <Duration>PT10M</Duration>
              <WaitTimeout>PT1H</WaitTimeout>
              <StopOnIdleEnd>true</StopOnIdleEnd>
              <RestartOnIdle>false</RestartOnIdle>
            </IdleSettings>
            <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
            <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
            <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
            <AllowHardTerminate>true</AllowHardTerminate>
            <StartWhenAvailable>false</StartWhenAvailable>
            <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
            <AllowStartOnDemand>true</AllowStartOnDemand>
            <Enabled>{3}</Enabled>
            <Hidden>false</Hidden>
            <RunOnlyIfIdle>false</RunOnlyIfIdle>
            <WakeToRun>false</WakeToRun>
            <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
            <Priority>7</Priority>
          </Settings>
          <Actions Context='Author'>
            <Exec>
              <Command>{4}</Command>
              <Arguments>{5}</Arguments>
              <WorkingDirectory>{6}</WorkingDirectory>
            </Exec>
          </Actions>
        </Task>"
    $registrationDateTime = [DateTime]::Now.ToString("yyyy-MM-dd") + "T" + [DateTime]::Now.ToString("HH:mm:ss")
    $startDateTime = [DateTime]::Now.ToString("yyyy-MM-dd") + "T" + $startTime + ":00"
    $xml = $xmlTemplate -f $registrationDateTime, $runAs, $startDateTime, $enable, $command, $arguments, $workingFolder

    $sch = new-object -ComObject("Schedule.Service")
    $sch.Connect($computer)
    $task = $sch.NewTask($null)
    $task.XmlText = $xml

    $createOrUpdateFlag = 6
    $sch.GetFolder("\").RegisterTaskDefinition($taskName, $task, $createOrUpdateFlag, $runAs, $runAsPassword, $null, $null) | out-null 
}
7 голосов
/ 12 декабря 2013

Если ничего не помогает, вы можете перенаправить в командный файл, который устанавливает свой собственный компакт-диск, а затем вызвать вашу программу.
например:

Schtasks /Create /TR "C:\example\batch.bat" /SC WEEKLY /TN mytask

как счтаск, а

cd "%temp%\"
"C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt"

как "C: \ example \ batch.bat". Это должно сохранить текущий каталог как тот, который вы изменили в командном файле, и сохранить все ссылки, относящиеся к этому.

2 голосов
/ 30 декабря 2011

Попробуйте

cd /d "C:\Program Files\Java\jre6\bin" & schtasks /create /tr "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" /sc WEEKLY /tn mytask

Измените рабочий каталог и запустите schtasks.

1 голос
/ 03 ноября 2011

Как вы заметили, хитрость использования дополнительных кавычек в параметре / TR позволяет использовать только тот же каталог, в котором находится исполняемый файл. Если вы хотите указать другой рабочий каталог, вам следует использовать параметр / XML и указать файл XML, в котором указан рабочий каталог. Команда будет выглядеть примерно так:

SchTasks /Create /TN "Foo" /XML task.xml

Файл XML будет выглядеть примерно так:

<?xml version="1.0" ?>
<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
    <RegistrationInfo>
        <Date>2006-05-02T13:21:17</Date>
        <Author>AuthorName</Author>
        <Version>1.0.0</Version>
        <Description>Call MoveFile</Description>
    </RegistrationInfo>
    <Triggers>
        <CalendarTrigger>
            <StartBoundary>2011-11-02T00:00:00</StartBoundary>
            <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
            </ScheduleByDay>
        </CalendarTrigger>
    </Triggers>
    <Principals>
        <Principal>
            <UserId>Administrator</UserId>
            <LogonType>InteractiveToken</LogonType>
        </Principal>
    </Principals>
    <Settings>
        <Enabled>true</Enabled>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <AllowHardTerminate>true</AllowHardTerminate>
    </Settings>
    <Actions>
        <Exec>
            <Command>C:\Program Files\Java\jre6\bin\javaw.exe</Command>
            <Arguments>main.MoveFile input.txt</Arguments>
            <WorkingDirectory>C:\My Library</WorkingDirectory>
        </Exec>
    </Actions>
</Task>

Более подробная информация о схеме XML приведена здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383609(v=VS.85).aspx

0 голосов
/ 19 июня 2019

Хорошо, я понимаю, что этому вопросу 10 лет (ВАУ! Ровно 10 лет, с днем ​​рождения!), Но я наткнулся на него сегодня так:

Потребность

Чтобы запланировать задачу, которая будет выполняться из определенного каталога. Если мы будем называть этот каталог c:\x всякий раз, когда выполняется команда pwd, она напечатает c:\x. Каждый путь оттуда относится к этому каталогу.

Другой пример: при запуске java -jar myapp.jar будет выполнен файл JAR , расположенный в c:\x\myapp.jar

проблема

Невозможно установить этот конкретный параметр с помощью команды schtasks /create

Решение

Немного хитро (как в слишком многих шагах):

  1. Создайте задачу как можно точнее, используя команду schtasks /create. Попробуйте установить для каждого параметра желаемое значение: время начала, повторение, продолжительность и т. Д.

    В этом случае аргумент /tn является обязательным, поэтому установите его: \tn mytask

  2. Экспорт вновь созданной задачи в XML с использованием schtasks /query /tn mytask /xml > mytask.xml

  3. Откройте mytasks.xml в вашем любимом редакторе. Вы должны увидеть что-то вроде этого (я скрыл не интересные части):

<?xml version="1.0" encoding="UTF-16"?>

<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">

 <RegistrationInfo>...
 </RegistrationInfo>

 <Triggers>...
 </Triggers>

 <Settings>...
 </Settings>

 <Actions Context="Author">

   <Exec>

     <Command>java</Command>

     <Arguments>-jar c:\x\myapp.jar</Arguments>

   </Exec>

 </Actions>

 <Principals>...
 </Principals>

</Task>
  1. В разделе <Exec> ниже поля <Argument> введите новое поле:
<WorkingDirectory>c:\x\</WorkingDirectory>

И сохраните файл. Это поле определено здесь в определении схемы xml https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-schema

  1. Удалить ранее созданную задачу (чтобы воссоздать ее с использованием измененного xml): schtasks /delete /tn mytask

  2. Создайте задачу снова, используя /xml аргумент: schtasks \tn mytask \xml mytask.xml

Просто чтобы посмотреть, работает ли оно

Выполнить с помощью schtasks /run /tn mytask

Вот и все, надеюсь, это поможет. Я знаю, это поможет мне в будущем:)

0 голосов
/ 13 июля 2016

Единственным способом было бы использовать XML Flle, используйте следующую команду: schtasks / Create / XML C: \ file.xml / TN имя_задачи / домен RU \ имя пользователя / пароль RP

Пример XML-файла, который будет запускаться каждый день в 23:00, папка C: \ task установит запуск в каталоге:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2016-07-13T07:56:56</Date>
    <Author>Administrator</Author>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2016-07-13T23:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>domain\Administrator</UserId>
      <LogonType>Password</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\taskfolder\task.bat</Command>
      <WorkingDirectory>C:\taskfolder</WorkingDirectory>
    </Exec>
  </Actions>
</Task>
0 голосов
/ 30 апреля 2015

Примечание: вот проблема, которую я только что видел с этим ..

Примечание: у вас должно быть две строки:

REM NOTE:You have to create the schedule first
SCHTASKS /S SERVER /CREATE /TN "SERVER_RESTART" /RU "" /TR "D:\WORK\scripts\__server_restart.bat 1" /SC MONTHLY /MO FIRST /D SUN /ST:02:10
REM The next line is run to set the run in folder as well as set the: run as: NT AUTHORITY\SYSTEM
SCHTASKS /S SERVER /CHANGE /TN "SERVER_RESTART" /RU "" /TR "D:\WORK\scripts\__server_restart.bat 1"

Одна из вещей, которую я заметил в Windows 2008, это то, что она обрабатывает пакетные сценарии, например, намного лучше, чем в 2003 году. Я не думаю, что папка «run in» так важна, как я только что запустил перезапуск сервера на тестовой машине вручную из планировщика заданий, и он работает просто отлично.

Для людей, которые могут столкнуться с проблемами с экранированием символов и т.п., рассмотрите следующее:

SCHTASKS /CHANGE /S SERVER /RU "" /TR "powershell -file "\"D:\WORK\ps\zip_up_files\zip_up_files.ps1"\"" /TN "PowerShell - New Archive"

или другой пример:

SCHTASKS /CREATE /S SERVER /RU "" /TR "powershell -file "\"D:\WORK\ps\page_test.ps1"\"" /TN "PowerShell - Page Test" /SC MINUTE /MO 3 /ST:23:00

Примечание: дополнительная квотирование и дополнительная обратная косая черта.

Надеюсь, это поможет!

0 голосов
/ 05 августа 2009

Я обнаружил, что если вы используете соглашение о присвоении имен 8.3 в командной строке SCHTASKS для пути и имен файлов, в поле «Start In» добавляется путь к файлу -

например. «C: \ Progra ~ 1 \ NBVCl ~ 1 \ nbv_up ~ 1.exe» приведет к появлению «C: \ Progra ~ 1 \ NBVCl ~ 1» в область «начало В»

...