Specifying “start-in” directory in schtasks command in windows
我意识到在以下线程中可以"回答"此问题:使用schtasks.exe为计划任务指定运行目录
但是,我仍然无法理解答案,也无法准确了解结果如何。
我的schtasks命令如下所示:
我想在" C: My Library"的目录中指定开始位置。 在tr部分之前放置"",以填充" C: Program Files Java jre6 bin"的开始目录。
我已经搞砸了很多,但是我似乎无法使其正常工作。
不知道您使用的是哪个版本的Windows,但是通过阅读其他问题,似乎在Vista / Server 2008上的schtasks没有提供允许您直接指定"启动"目录的命令选项。人们提供的解决方法是:
更新:请注意,从Powershell v3(但仅在Windows 2012及更高版本中!)开始,有一个新的API,我发现它更具吸引力:
1 2 3 4 5 6 7 8 9 10 11 12 | $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的
用法:
1 2 3 4 5 6 7 8 9 | 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" |
(请注意,
实现方式:
该函数使用XML任务定义和" Schedule.Service" COM对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | ##################################################### # # 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的批处理文件,然后调用程序。
例如:
1 | Schtasks /Create /TR"C:\example\batch.bat" /SC WEEKLY /TN mytask |
作为schtask,并且
1 2 | cd"%temp%" "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" |
作为" C: example batch.bat"。那应该将当前目录保留为您在批处理文件中更改的目录,并保留所有与之相对的引用。
尝试
1 | 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文件。该命令将是这样的:
1 | SchTasks /Create /TN"Foo" /XML task.xml |
XML文件如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?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/zh-cn/library/windows/desktop/aa383609(v=VS.85).aspx
好的,我意识到这个问题已有10年了(哇!正好是10年,生日快乐!),但是我今天碰到了这个问题,所以:
需要
计划将从特定目录运行的任务。如果我们在每次执行
另一个示例:运行
问题
使用命令
解决方案
有点草率(就像太多步骤一样):
使用
在这种情况下,
使用
在您喜欢的编辑器中打开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?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 | <WorkingDirectory>c:\x\</WorkingDirectory> |
并保存文件。此字段在xml架构定义中定义,网址为https://docs.microsoft.com/zh-cn/windows/desktop/taskschd/task-scheduler-schema
删除先前创建的任务(以使用修改后的xml重新创建它):
使用
只是看看它是否有效
使用
就是这样,希望对您有所帮助。我知道这会在将来对我有所帮助:)
唯一的方法是使用XML Flle,使用以下命令:schtasks / Create / XML C: file.xml / TN TaskName / RU domain username / RP password
示例XML文件每天23:00运行,C: taskfolder将在目录中设置运行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?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> |
注意:这是我刚刚看到的问题。
注意:您必须有两行:
1 2 3 4 | 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手动在测试计算机上重新启动服务器那样重要,它运行正常。
对于可能遇到转义字符等问题的人们,请考虑以下事项:
1 | SCHTASKS /CHANGE /S SERVER /RU"" /TR"powershell -file""D:\WORK\ps\zip_up_files\zip_up_files.ps1""" /TN"PowerShell - New Archive" |
或者,另一个例子:
1 | 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 |
注意:额外的报价和额外的反斜杠。
希望这可以帮助!
我发现,如果您在SCHTASKS命令行中使用8.3命名约定作为路径和文件名,则"开始于"字段将使用文件路径进行填充-
例如" C: Progra?1 nBVCl?1 nbv_up?1.exe"将导致" C: Progra?1 nBVCl?1"出现在
"开始于"区域