在windows中的schtasks命令中指定"start-in"目录

Ben*_*nny 20 windows scheduled-tasks

我意识到在以下线程中"回答"了这个问题:使用schtasks.exe为Scheduled Tasks指定运行目录

但是,我仍然无法理解答案,并确切了解结果对于我的情况会是什么样子.

我的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"的起始目录.

我已经搞砸了很多,但我似乎无法让它发挥作用.

Ama*_*ena 14

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

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

  • `/v1` 标志在命令中的位置在哪里?它需要任何论据吗? (2认同)

and*_*ter 12

更新:请注意,从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
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

(注意,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 
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这仅适用于Windows 2012及更高版本的Powershell 3.即使使用Powershell 3,Windows 2008R2也没有这个功能. (2认同)

Eva*_*van 8

如果所有其他方法都失败了,您可以重定向到设置自己的CD的批处理文件,然后调用您的程序.
例如:

Schtasks /Create /TR "C:\example\batch.bat" /SC WEEKLY /TN mytask
Run Code Online (Sandbox Code Playgroud)

作为schtask,和

cd "%temp%\"
"C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt"
Run Code Online (Sandbox Code Playgroud)

as"C:\ example\batch.bat".这应该保持当前目录为您在批处理文件中更改它的任何内容并保留所有相关的引用.