create - Especificando el directorio "start-in" en el comando schtasks en windows
windows task scheduler c# (8)
Me doy cuenta de que esta pregunta se "responde" en el siguiente hilo: Especificación del directorio en ejecución para las tareas programadas mediante schtasks.exe
Sin embargo, todavía tengo problemas para entender la respuesta y ver exactamente cómo se vería el resultado de mi situación.
Mi comando schtasks tiene este aspecto:
Schtasks /Create /TR "C:/Program Files/Java/jre6/bin/javaw.exe main.MoveFile input.txt" /SC WEEKLY /TN mytask
Quiero especificar el inicio en el directorio de "C: / Mi biblioteca". Poner una "/" antes de que la sección tr complete un directorio de inicio de "C: / Archivos de programa / Java / jre6 / bin".
Me he metido mucho en eso, pero parece que no puedo hacer que funcione.
Como ha notado, el truco de usar las comillas adicionales en el parámetro / TR solo le permite usar el mismo directorio donde reside el ejecutable. Si desea especificar un directorio de trabajo diferente, debe usar la opción / XML y especificar un archivo XML que incluya el directorio de trabajo. El comando sería algo como esto:
SchTasks /Create /TN "Foo" /XML task.xml
El archivo XML se vería así:
<?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>
Aquí hay más información sobre el esquema XML: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383609(v=VS.85).aspx
Descubrí que si usa la convención de nomenclatura 8.3 en la línea de comandos SCHTASKS para la ruta y los nombres de archivo, el campo "Comenzar en" se pulula con la ruta del archivo
por ejemplo, "C: / Progra ~ 1 / NBVCl ~ 1 / nbv_up ~ 1.exe" dará lugar a que aparezca "C: / Progra ~ 1 / NBVCl ~ 1" en el área "start In"
La única forma sería usar un archivo XML, use el siguiente comando: schtasks / Create / XML C: / file.xml / TN TaskName / RU domain / username / RP password
Ejemplo de archivo XML que se ejecutará todos los días a las 23:00, la carpeta C: / task establecerá la ejecución en el directorio:
<?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>
No estoy seguro de en qué versión de Windows está, pero al leer la otra pregunta, parece que schtasks en Vista / Server 2008 no proporciona una opción de comando que le permita especificar un directorio de "inicio de sesión" directamente. Las soluciones que proporcionaron las personas fueron:
- Use el indicador / v1 para crear una tarea compatible con XP / 2003, en cuyo caso el directorio "start-in" se configurará automáticamente. No estoy seguro de en qué está configurado, pero sospecho que puede ser el mismo directorio que el ejecutable de su tarea, que no funcionará para usted.
- Cree su tarea a partir de un archivo XML (usando la opción / XML) que le permite especificar un directorio de "inicio de sesión". Lo siento, no sé la sintaxis / estructura para este archivo XML.
- Cree su tarea utilizando la IU del Programador de tareas en su lugar.
Nota: Aquí está el problema que acabo de ver con esto ...
Nota: Tienes que tener dos líneas:
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"
Una de las cosas que he notado con Windows 2008, es que maneja los scripts por lotes mucho mejor que el 2003, por ejemplo. No creo que la carpeta "ejecutar en" sea tan importante ya que simplemente ejecuté el reinicio del servidor en una máquina de prueba manualmente desde el Programador de tareas y se ejecuta bien ...
Para la gente que quizás tenga problemas con los personajes que se escapan, considere lo siguiente:
SCHTASKS /CHANGE /S SERVER /RU "" /TR "powershell -file "/"D:/WORK/ps/zip_up_files/zip_up_files.ps1"/"" /TN "PowerShell - New Archive"
o, otro ejemplo:
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
Nota: El presupuesto adicional y las barras invertidas adicionales.
¡Espero que esto ayude!
Si todo lo demás falla, puede redirigir a un archivo por lotes que establece su propio CD y luego llama a su programa.
por ejemplo:
Schtasks /Create /TR "C:/example/batch.bat" /SC WEEKLY /TN mytask
Como el schtask, y
cd "%temp%/"
"C:/Program Files/Java/jre6/bin/javaw.exe main.MoveFile input.txt"
como "C: / example / batch.bat". Eso debería mantener el directorio actual como lo que sea que lo cambie en el archivo por lotes y guardar todas las referencias relativas a eso.
Tratar
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
Cambia el directorio de trabajo y luego ejecuta schtasks.
ACTUALIZACIÓN: tenga en cuenta que a partir de Powershell v3 (¡pero solo en Windows 2012 y versiones posteriores!) Hay una nueva API que me parece mucho más atractiva:
$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
La solución de Amal con el conmutador /v1
es excelente, pero no permite crear tareas en carpetas personalizadas (es decir, no puede crear "MyCompany / MyTask" y todo termina en la carpeta raíz), por lo que finalmente terminé con un script de PowerShell descrito abajo.
Uso:
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"
(Tenga en cuenta que la enable
debe estar en minúsculas: para un booleano necesitaría $value.ToString().ToLower()
)
Implementación:
La función utiliza la definición de tarea XML y el objeto 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
}