在windows中指定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”的开始目录。

我已经搞砸了很多,但我似乎无法使其工作。

不知道你在使用什么版本的Windows,但是从阅读其他问题看起来像Vista / server 2008上的schtasks没有提供一个命令选项,允许你直接指定一个“开始”目录。 人们提供的解决方法是:

  1. 使用/ v1标志创建一个兼容XP / 2003的任务,在这种情况下,“开始”目录是自动设置的。 不知道它是什么设置,但我怀疑它可能是您的任务可执行文件相同的目录,这不会为你工作。
  2. 从XML文件创建您的任务(使用/ XML选项),它允许您指定一个“开始”目录。 对不起,我不知道这个XML文件的语法/结构。
  3. 相反,使用任务计划程序用户界面创建您的任务。

更新:请注意,从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 

使用/v1开关的Amal的解决方案是伟大的,但不允许在自定义文件夹中创建任务(即你不能创建“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任务定义和“Schedule.Service”COM对象。

 ##################################################### # # 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 } 

如果一切都失败了,你可以重定向到一个批处理文件来设置它自己的CD,然后调用你的程序。
例如:

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

作为schtask,和

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

作为“C:\ example \ batch.bat”。 这应该保持目前的目录,无论你改变它的批处理文件,并保持所有相关的引用。

尝试

 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。

正如你注意到的,在/ 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

我发现,如果您在SCHTASKS命令行中使用8.3命名约定作为路径和文件名称,则“开始”字段将使用文件路径进行轮询 –

例如“C:\ Progra〜1 \ NBVCl〜1 \ nbv_up〜1.exe”会导致出现在“start In”区域的“C:\ Progra〜1 \ NBVCl〜1”

注意:这是我刚刚看到的这个问题..

注意:你必须有两行:

 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 

注意:额外的引用和额外的反斜杠。

希望这可以帮助!

唯一的办法是使用XML Flle,使用以下命令:schtasks / Create / XML C:\ file.xml / TN TaskName / RU domain \ username / RP password

示例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>