web-dev-qa-db-fra.com

Spécification du répertoire "start-in" dans la commande schtasks dans Windows

Je me rends compte que cette question a reçu une réponse au fil suivant: Spécification du répertoire en cours d'exécution pour les tâches planifiées à l'aide de schtasks.exe

Cependant, j'ai toujours du mal à comprendre la réponse et à voir exactement quel en serait le résultat pour ma situation.

Ma commande schtasks ressemble à ceci:

Schtasks /Create /TR "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" /SC WEEKLY /TN mytask

Je veux spécifier le début dans le répertoire de "C:\My Library". Mettre un "\" avant la section tr complète le répertoire de démarrage de "C:\Program Files\Java\jre6\bin".

J'ai beaucoup joué avec ça, mais je n'arrive pas à le faire fonctionner.

18
Benny

Vous ne savez pas quelle version de Windows vous utilisez, mais si vous lisez l’autre question, cela ressemble à des schtasks sur Vista/Server 2008 ne fournit pas une option de commande qui vous permettrait de spécifier directement un répertoire de "démarrage". Les solutions proposées par les utilisateurs étaient:

  1. Utilisez l'indicateur/v1 pour créer une tâche compatible XP/2003, auquel cas le répertoire "start-in" est automatiquement défini. Vous ne savez pas exactement sur quoi il est défini, mais je suppose que ce pourrait être le même répertoire que votre tâche exécutable, ce qui ne fonctionnera pas pour vous.
  2. Créez votre tâche à partir d'un fichier XML (à l'aide de l'option/XML), ce qui vous permet de spécifier un répertoire "start-in". Désolé, je ne connais pas la syntaxe/structure de ce fichier XML.
  3. Créez votre tâche à l'aide de l'interface utilisateur du planificateur de tâches. 
14
Amal Sirisena

UPDATE: Notez qu'à partir de Powershell v3 (mais uniquement sous Windows 2012 et supérieur!), Il y a une nouvelle API que je trouve beaucoup plus attrayante:

$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

La solution d'Amal avec le commutateur /v1 est géniale, mais elle ne permet pas de créer des tâches dans des dossiers personnalisés (vous ne pouvez pas créer "MyCompany\MyTask" et tout se termine dans le dossier racine). au dessous de.

Utilisation:  

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"

(Remarque: enable doit être en minuscule - pour un booléen, vous auriez besoin de $value.ToString().ToLower())

La mise en oeuvre:

La fonction utilise la définition de tâche XML et l'objet COM "Schedule.Service".

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

Si tout échoue, vous pouvez rediriger vers un fichier de commandes qui définit son propre CD, puis appelle votre programme.
par exemple: 

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

Comme le schtask, et 

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

comme "C:\exemple\batch.bat". Cela devrait conserver le répertoire actuel tel que vous le modifiez dans le fichier de commandes et conserver toutes les références relatives à celui-ci. 

7
Evan

Essayer 

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

Modifiez le répertoire de travail, puis exécutez les schtasks.

2
Yuh-Rong Leu

Comme vous le constatez, l’astuce d’utiliser les guillemets supplémentaires dans le paramètre/TR vous permet uniquement d’utiliser le même répertoire que celui où se trouve l’exécutable. Si vous souhaitez spécifier un autre répertoire de travail, vous devez utiliser l'option/XML et spécifier un fichier XML qui répertorie le répertoire de travail. La commande ressemblerait à ceci:

SchTasks /Create /TN "Foo" /XML task.xml

Le fichier XML ressemblerait à ceci:

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

Vous trouverez plus d'informations sur le schéma XML ici: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa383609(v=VS.85).aspx

1
Bernard Chen

J'ai constaté que, si vous utilisez la convention de dénomination 8.3 dans la ligne de commande SCHTASKS pour les noms de chemin d'accès et de fichier, le champ "Démarrer dans" est polulé avec le chemin d'accès au fichier - 

par exemple. "C:\Progra ~ 1\NBVCl ~ 1\nbv_up ~ 1.exe" donnera "C:\Progra ~ 1\NBVCl ~ 1" dans la zone "start In".

0
Chris Roll

Le seul moyen serait d'utiliser un fichier XML, utilisez la commande suivante: schtasks/Create/XML C:\fichier.xml/TN Nom de la tâche/Domaine RU\Nom d'utilisateur/Mot de passe RP

Exemple de fichier XML qui s'exécutera tous les jours à 23h00, le dossier de tâches C:\définira le répertoire d'exécution:

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

Note: Voici le problème que je viens de voir avec ça ..

Remarque: vous devez avoir deux lignes:

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"

L'une des choses que j'ai remarquées avec Windows 2008, c'est qu'il gère les scripts de commandes beaucoup mieux que 2003, par exemple. Je ne pense pas que le dossier "run in" soit aussi important que je viens d'exécuter le redémarrage du serveur sur une machine de test manuellement à partir du Planificateur de tâches et que ça fonctionne très bien ..

Pour les personnes qui rencontrent peut-être des problèmes avec des caractères d'échappement, considérez les points suivants:

SCHTASKS /CHANGE /S SERVER /RU "" /TR "powershell -file "\"D:\WORK\ps\Zip_up_files\Zip_up_files.ps1"\"" /TN "PowerShell - New Archive"

ou un autre exemple:

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

Remarque: Les citations supplémentaires et les barres obliques inverses supplémentaires.

J'espère que cela t'aides!

0
Leptonator