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.
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:
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
}
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.
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.
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
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".
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>
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!