【问题标题】:Specifying "start-in" directory in schtasks command in windows在 Windows 的 schtasks 命令中指定“start-in”目录
【发布时间】:2010-11-04 10:28:45
【问题描述】:

我意识到这个问题在以下线程中得到了“回答”:Specifying the running directory for Scheduled Tasks using 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 scheduled-tasks


    【解决方案1】:

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

    Amal 的带有/v1 开关的解决方案很棒,但不允许在自定义文件夹中创建任务(即,您不能创建“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 
    }
    

    【讨论】:

    • 不幸的是,这仅适用于 Windows 2012 及更高版本下的 Powershell 3。 Windows 2008R2 没有此功能,即使使用 Powershell 3。
    • 好收获。更新了答案
    • XML 似乎是要走的路,至少如果你想编写一个可以跨不同服务器使用的脚本,尤其是 Windows Server 2012 之前的版本。
    【解决方案2】:

    如果所有其他方法都失败了,您可以重定向到一个批处理文件来设置它自己的 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”。这应该将当前目录保留为您在批处理文件中将其更改为的任何目录,并保留所有与该目录相关的引用。

    【讨论】:

    • 这是最好的解决方案,应该被赞成。与其他解决方案不同,它不需要 Windows 2012 或 XML 解决方案,并且与 Windows 2008 R2 没有问题。
    • +1 提醒我可以直接在/TR中指定.bat文件,不需要调用cmd.exe等
    • 这个解决方案很好,我使用了它,但它不允许我安排第二个任务来用 taskkill /t 杀死一个 win32 控制台应用程序,如果我不启动它是可能的通过 .bat 文件。杀死此类应用程序的唯一方法是 taskkill /f,它不允许程序在强制终止之前进行清理。
    【解决方案3】:

    不确定您使用的是哪个版本的 Windows,但从阅读其他问题来看,Vista / Server 2008 上的 schtasks 似乎没有提供允许您直接指定“启动”目录的命令选项。人们提供的解决方法是:

    1. 使用 /v1 标志创建一个与 XP / 2003 兼容的任务,在这种情况下会自动设置“start-in”目录。不确定它的设置,但我怀疑它可能与您的任务可执行文件位于同一目录,这对您不起作用。
    2. 从允许您指定“起始”目录的 XML 文件(使用 /XML 选项)创建任务。抱歉,我不知道这个 XML 文件的语法/结构。
    3. 改为使用任务计划程序 UI 创建您的任务。

    【讨论】:

    • 很好的解决方案,但似乎不允许带有文件夹的任务名称 - 即您不能使用 /v1 开关创建“MyCompany\MyTask”(虽然没有开关也可以)
    • /V1 标志有效,但您需要确保您的 /TR 路径在路径中使用反斜杠。当我在路径中使用正斜杠时,任务没有成功运行。
    • /v1 标志在命令中的什么位置?它需要任何参数吗?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      试试

      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。

      【讨论】:

      • 此方法适用于 Windows Server 2008,但不适用于 Windows Server 2008 R2。 :(
      • 此方法不适用于 Windows 8.1 和 Windows 2008 R2 Standard
      【解决方案6】:

      需要

      安排从特定目录运行的任务。 如果我们在每次执行pwd 命令时调用此目录c:\x,它将打印c:\x。从那里开始的每条路径都相对于该目录。

      另一个例子:运行java -jar myapp.jar将执行位于c:\x\myapp.jarJAR文件

      问题

      无法使用命令schtasks /create设置该特定参数

      解决方案

      有点步履蹒跚(比如步数太多):

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

        在这种情况下,/tn 参数是强制性的,所以设置它:\tn mytask

      2. 使用schtasks /query /tn mytask /xml &gt; mytask.xml将新创建的任务导出到XML

      3. 在您喜欢的编辑器中打开mytasks.xml。你应该会看到这样的东西(我已经隐藏了不感兴趣的部分):

      <?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. &lt;Exec&gt; 部分内,&lt;Argument&gt; 字段下方引入了一个新字段:
      <WorkingDirectory>c:\x\</WorkingDirectory>
      

      并保存文件。此字段在此处的 xml 架构定义中定义 https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-schema

      1. 删除之前创建的任务(使用修改后的 xml 重新创建):schtasks /delete /tn mytask

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

      只是看看它是否有效

      使用schtasks /run /tn mytask 执行它。

      【讨论】:

        【解决方案7】:

        我发现如果您在 SCHTASKS 命令行中为路径和文件名使用 8.3 命名约定,“Start In”字段将使用文件路径填充 -

        例如"C:\Progra~1\NBVCl~1\nbv_up~1.exe" 将导致 "C:\Progra~1\NBVCl~1" 出现在 “起点”区域

        【讨论】:

          【解决方案8】:

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

          注意:你必须有两行:

          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 好得多,例如。我认为“运行”文件夹并不像我刚刚从任务计划程序手动在测试机器上重新启动服务器那样重要,它运行得很好..

          对于可能遇到转义字符等问题的人,请考虑以下事项:

          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
          

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

          希望这会有所帮助!

          【讨论】:

            【解决方案9】:

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

            每天 23:00 运行的示例 XML 文件,C:\task 文件夹将设置运行目录:

            <?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>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-03-28
              • 2014-12-11
              • 2011-01-10
              • 1970-01-01
              • 2011-10-12
              • 1970-01-01
              • 2012-10-10
              • 2021-10-06
              相关资源
              最近更新 更多