Указание каталога "start-in" в команде schtasks в окнах
Я понимаю, что этот вопрос "ответил" на следующий поток: Указание работающего каталога для запланированных задач с помощью файла 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".
Я много перепутал с этим, но я просто не могу заставить его работать.
Ответы
Ответ 1
Не знаете, в какой версии Windows вы находитесь, но, читая другой вопрос, похоже, что schtasks на Vista/Server 2008 не предоставляет параметр команды, который позволит вам напрямую указать каталог "start-in" . Общими обходами были:
- Используйте флаг /v 1 для создания задачи, совместимой с XP/2003, и в этом случае автоматически устанавливается каталог "start-in" . Не уверен, на что он установлен, но я подозреваю, что это может быть тот же каталог, что и исполняемый файл вашей задачи, который не будет работать для вас.
- Создайте свою задачу из XML файла (используя параметр /XML ), который позволяет вам указать каталог "start-in" . Извините, я не знаю синтаксиса/структуры для этого XML файла.
- Создайте свою задачу, используя пользовательский интерфейс планировщика заданий.
Ответ 2
ОБНОВЛЕНИЕ: Обратите внимание, что начиная с версии 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 script, описанным ниже.
Использование:
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:"[email protected]$$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
}
Ответ 3
Если ничего не помогает, вы можете перенаправить на командный файл, который устанавливает свой собственный компакт-диск, а затем вызывает вашу программу.
например:
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". Это должно сохранить текущий каталог как тот, который вы изменили в командном файле, и сохранить все ссылки, относящиеся к этому.
Ответ 4
Попробуйте
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.
Ответ 5
Как вы заметили, трюк использования дополнительных кавычек в параметре /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
Ответ 6
Я обнаружил, что если вы используете соглашение о присвоении имен 8.3 в командной строке SCHTASKS для имени пути и файла, поле "Начало" выставляется с файловым путем -
например. "C:\Progra ~ 1\NBVCl ~ 1\nbv_up ~ 1.exe" приведет к появлению "C:\Progra ~ 1\NBVCl ~ 1", появляющегося в область "Начало в"
Ответ 7
Примечание. Вот проблема, которую я только что видел с этим.
Примечание. Вы должны иметь две строки:
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, например. Я не думаю, что папка "запустить в" важна, так как я просто запускал перезапуск сервера на тестовой машине вручную из Task Scheduler, и он работает просто отлично.
Для людей, которые могут столкнуться с проблемами с экранирующими символами и т.д., рассмотрите следующее:
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
Примечание: дополнительные цитаты и дополнительные обратные косые черты.
Надеюсь, это поможет!
Ответ 8
Единственным способом было бы использовать XML Flle, используйте следующую команду: schtasks/Create/XML C:\file.xml/TN TaskName/RU domain\имя пользователя/пароль RP
Пример XML файла, который будет запускаться каждый день в 23:00, C:\taskfolder установит прогон в каталоге:
<?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>
Ответ 9
Хорошо, я понимаю, что этому вопросу 10 лет (ВАУ! Ровно 10 лет, с днем рождения!), Но я наткнулся на него сегодня так:
Необходимость
Чтобы запланировать задачу, которая будет запускаться из определенного каталога. Если мы вызовем этот каталог c:\x
всякий раз, когда выполняется команда pwd
он напечатает c:\x
. Каждый путь оттуда относится к этому каталогу.
Другой пример: запуск java -jar myapp.jar
выполнит файл JAR, расположенный в c:\x\myapp.jar
Эта проблема
Невозможно установить этот конкретный параметр с помощью команды schtasks/create
Решение
Это немного хитро (как в слишком много шагов):
-
Создайте задачу как можно точнее, используя команду schtasks/create
. Попробуйте установить для каждого параметра желаемое значение: время начала, повтор, продолжительность и т.д.
В этом случае аргумент /tn
является обязательным, поэтому установите его: \tn mytask
-
Экспортируйте вновь созданную задачу в XML, используя schtasks/query/tn mytask/xml > mytask.xml
-
Откройте 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>
- Внутри секции
<Exec>
ниже поля <Argument>
введите новое поле:
<WorkingDirectory>c:\x\</WorkingDirectory>
И сохраните файл. Это поле определено в определении схемы XML здесь https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-schema
-
Удалить ранее созданную задачу (чтобы воссоздать ее с использованием модифицированного XML): schtasks/delete/tn mytask
-
Снова создайте задачу, используя аргумент /xml
: schtasks \tn mytask \xml mytask.xml
Просто чтобы посмотреть, работает ли это
Выполните его, используя schtasks/run/tn mytask
Вот оно, надеюсь, это поможет. Я знаю, это поможет мне в будущем :)