关于计划的任务:在Windows的schtasks命令中指定“启动”目录

Specifying “start-in” directory in schtasks command in windows

我意识到在以下线程中可以"回答"此问题:使用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没有提供允许您直接指定"启动"目录的命令选项。人们提供的解决方法是:

  • 使用/ v1标志创建XP / 2003兼容任务,在这种情况下,将自动设置"开始"目录。不确定将其设置为什么,但我怀疑它可能与您的任务可执行文件位于同一目录,该目录对您不起作用。
  • 从XML文件(使用/ XML选项)创建任务,该文件允许您指定"开始"目录。抱歉,我不知道此XML文件的语法/结构。
  • 而是使用"任务计划程序" UI创建任务。

  • 更新:请注意,从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的/v1开关解决方案很棒,但是不允许在自定义文件夹中创建任务(即,您无法创建" MyCompany MyTask",并且所有内容都在根文件夹中),因此我最终使用了PowerShell脚本如下所述。

    用法:

    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"

    (请注意,enable必须为小写-对于布尔值,您需要$value.ToString().ToLower())

    实现方式:

    该函数使用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年,生日快乐!),但是我今天碰到了这个问题,所以:

    需要

    计划将从特定目录运行的任务。如果我们在每次执行pwd命令时将此目录称为c:\x,它将打印c:\x。那里的每个路径都相对于该目录。

    另一个示例:运行java -jar myapp.jar将执行c:\x\myapp.jar中的JAR文件

    问题

    使用命令schtasks /create不能设置该特定参数

    解决方案

    有点草率(就像太多步骤一样):

  • 使用schtasks /create命令尽可能具体地创建任务。尝试将每个参数设置为所需的值:开始时间,重复次数,持续时间等。

    在这种情况下,/tn参数是必需的,因此将其设置为:\tn mytask

  • 使用schtasks /query /tn mytask /xml > mytask.xml将新创建的任务导出到XML

  • 在您喜欢的编辑器中打开mytasks.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
    <?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重新创建它):schtasks /delete /tn mytask

  • 使用/xml参数再次创建任务:schtasks \tn mytask \xml mytask.xml

  • 只是看看它是否有效

    使用schtasks /run /tn mytask执行

    就是这样,希望对您有所帮助。我知道这会在将来对我有所帮助:)


    唯一的方法是使用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"出现在
    "开始于"区域