I realize that this question is "answered" at the following thread: Specifying the running directory for Scheduled Tasks using schtasks.exe
However, I'm still having trouble understanding the answer and seeing exactly what the result would look like for my situation.
My schtasks command looks like this:
Schtasks /Create /TR "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" /SC WEEKLY /TN mytask
I want to specify the start in directory of "C:\My Library". Putting a "\" before the tr section fills in a start-in directory of "C:\Program Files\Java\jre6\bin".
I've messed around with it a lot, but I just can't seem to make it work.
Go to the Scheduled Tasks applet in Control Panel, right-click the task you want to start immediately, and select Run from the displayed context menu.
The schtasks command enables an administrator to create, delete, query, change, run, and end scheduled tasks on a local or remote system.
UPDATE: Note that starting from Powershell v3 (but only under Windows 2012 and higher!) there's new API which I find much more attractive:
$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's solution with /v1
switch is great but doesn't allow to create tasks in custom folders (ie you can't create "MyCompany\MyTask" and everything ends up in the root folder), so I finally ended up with a PowerShell script described below.
Usage:
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"
(Note, enable
must be lowercase - for a boolean you'd need $value.ToString().ToLower()
)
Implementation:
The function uses XML task definition and "Schedule.Service" COM object.
##################################################### # # 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 }
If all else fails, you can redirect to a batch file that sets it's own CD, then calls your program.
for example:
Schtasks /Create /TR "C:\example\batch.bat" /SC WEEKLY /TN mytask
As the schtask, and
cd "%temp%\" "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt"
as "C:\example\batch.bat". That should keep the current directory as whatever you change it to in the batch file and keep all references relative to that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With