2011-04-14 05:24:06 +0000 2011-04-14 05:24:06 +0000
15
15

Comment passer un argument à une tâche planifiée de Windows avec des espaces

Je dois mettre en place une tâche planifiée Windows. Elle accepte 1 paramètre/argument qui est un chemin d'accès et peut contenir des espaces. Ma tâche programmée ne fonctionne pas - elle “casse” le paramètre au premier espace.

Si je l'exécute dans l'invite de commande, je peux juste ajouter l'argument “ ” et cela fonctionne bien, mais cela ne fonctionne pas dans l'interface utilisateur de la tâche programmée.

par exemple C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

J'ai essayé d'envelopper l'argument avec “ ” ‘ ’ et j'ai essayé de remplir les espaces avec %20, ~1 etc. sans succès.

Je connais une solution pour faire un fichier bat et utiliser “ ” autour de mon argument mais je ne veux pas ajouter plus de complexité.

Je l'ai essayé sur Windows 7 et Windows 2008 Server et les deux ont échoué. Il semble qu'il n'y ait pas de discussions à ce sujet ?

Réponses (8)

6
6
6
2016-04-12 05:46:09 +0000
schtasks.exe /create /SC WEEKLY /D SUN /SD 11/12/2015 /ST 12:00:00 /TN "taskname" /TR "'c:\program files(x86)\task.exe' Arguments"

Notez l'utilisation de ' dans le chemin d'un fichier à exécuter.

6
6
6
2011-05-19 20:24:00 +0000

J'ai travaillé avec des tâches programmées et vous mettez généralement les arguments dans sa propre boîte de saisie. Cela signifie que vous pointez l'action vers le programme/le champ de saisie pointe vers l'exe et que le champ “Ajouter des arguments” devrait avoir tous les paramètres. (http://technet.microsoft.com/en-us/library/cc770904.aspx))

Je crois que ce comportement a été ajouté pour éviter que les espaces dans le chemin du fichier vers l'exe ne posent des problèmes.

Je fais cela tout le temps avec des scripts PowerShell. Voici un exemple :

  • Programme/script: powershell.exe
  • Ajouter des arguments : -commande “& ‘C:\HSD - Copy\logoffstudents.ps1’ ” -Non interactif
  • Démarrer en: blanc
3
3
3
2011-04-14 06:31:15 +0000

Dans ce cas, vous pourriez contourner le problème en passant votre paramètre de chemin d'accès au format 8.3.

Vous pouvez découvrir le format 8.3 de votre chemin en ouvrant une invite de commande et en émettant la commande dir /x à la racine de votre disque.

Vous devriez voir une entrée similaire à

11/04/2011 12:10 <DIR> PROGRA~1 Program Files

pour votre répertoire Program Files.

Changez ensuite de répertoire pour Program Files avec cd "Program Files“ suivi de cd xyz et rééditez dir /x pour trouver le nom de format 8.3 pour "The Interface”, et ainsi de suite.

Votre chemin final pour l'exemple que vous avez donné ressemblerait à quelque chose comme :

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1
1
1
1
2013-10-27 22:45:45 +0000

J'ai eu un problème similaire avec VLC, que j'utilisais sous Windows XP. L'astuce consiste à insérer l'argument de la commande cmd entre guillemets.

Voici un exemple de ce que j'ai utilisé (programmation d'un enregistrement à 15:00) :

à 15:00 cmd /c “"C:\Programmi\VideoLAN\VLC\vlc.exe dvb-t://frequency=698000000 :program=4006 :run-time=5 –sout "C:\Documents and Settings\UserName\Documents\Video\VLC\test.mpg”“

Notez l'utilisation de guillemets doubles juste après /c et à la fin de la commande (après .mpg). L'argument avec des espaces dans ce cas est "C:\Documents and Settings\..."

1
1
1
2017-02-15 13:27:49 +0000

Un moyen d'y parvenir est d'utiliser powerhell depuis la ligne de commande.

Ajoutez ce code à un fichier appelé MyModule.psm1.

$TASK_STATE_UNKNOWN = 0;
$TASK_STATE_DISABLED = 1;
$TASK_STATE_QUEUED = 2;
$TASK_STATE_READY = 3;
$TASK_STATE_RUNNING = 4;
Function Run-Task(
        [ValidateNotNullOrEmpty()][string]
        [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $ComputerName, 
        [ValidateNotNullOrEmpty()][string]
        [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $Foldername, 
        [ValidateNotNullOrEmpty()][string]
        [Parameter(Mandatory=$true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $Taskname, 
        [int] $maxwait = 0, 
        [string[]]
        [Parameter(Mandatory=$false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        $TaskParameters = $null
    ){
    $TaskScheduler = New-Object -ComObject Schedule.Service
    $TaskScheduler.Connect($ComputerName)
    $ScheduledTaskFolder = $TaskScheduler.GetFolder($Foldername)
    $ScheduledTask = $ScheduledTaskFolder.GetTask($TaskName)

    if(-not $ScheduledTask) {
        return $Null
    }

    $ScheduledTask.Enabled = $True
    $ScheduledTask.Run($TaskParameters)

    if($maxwait -gt 0){
        $seconds = 5
        $i = 0;
        Start-Sleep -Seconds $seconds
        while ($ScheduledTask.State -eq $TASK_STATE_RUNNING)
        {
            if(($i * $seconds) -gt $maxwait) { 
                break; 
            } 
            Start-Sleep -Seconds $seconds        
            $i++;
        }
    }
    return $ScheduledTask
}

Export-ModuleMember -Variable "TASK_STATE*"
Export-ModuleMember -Function "Run-*"

Puis, à partir de la ligne de commande OU d'un fichier ps1, vous pouvez exécuter :

Import-Module $(Get-Item .\MyModule.psm1 | Resolve-Path -Relative) -DisableNameChecking -Force

$task = Run-Task -ComputerName "$env:COMPUTERNAME" -Taskname "Foo" -Foldername "\" -TaskParameters "test", "Tim C", $(Get-Date -format G)

Chaque élément respectif du tableau des paramètres de la tâche serait transmis sous la forme $(Arg0), $(Arg1), et $(Arg2).

0
0
0
2014-04-28 13:52:02 +0000

Définissez votre tâche programmée comme suit

cmd /c C:\Program Files\xyz\FTP File TransferTransferTask.exe “C:\Program Files\xyz\The Interface\Folder Path”.

0
0
0
2015-04-20 19:48:47 +0000

Il pourrait être utile de comprendre le problème sous un autre angle.. Disons que vous êtes le programmeur qui a été chargé d'ajouter un planificateur de tâches à Windows. Comment le feriez-vous ? Vous devez faire face à plusieurs problèmes : Si la tâche est exécutée par une personne autre que l'utilisateur connecté, devez-vous déranger l'utilisateur connecté avec des popups d'erreur ? Que faire si aucun utilisateur n'est connecté au moment où la tâche est exécutée ? Quelle est la différence entre un programme d'interface graphique et un programme de console ? Les interfaces graphiques n'ont pas de stdin, stdout et stderr ; le concept n'a aucun sens dans ces interfaces. Qu'en est-il des programmes internes ou externes à COMMAND.COM/CMD.EXE ? Ou d'autres moteurs de script ? Qu'en est-il des chemins avec des espaces dans le nom de la commande ? Ou dans les paramètres (options/arguments) ? (Comme vous essayez de le faire maintenant..)

Bien que je ne sois pas sûr à 100% des détails techniques ou internes dans ce cas, les réponses semblent être.. Les tâches sont exécutées dans une session isolée, non interactive, qui ne peut pas interagir avec l'utilisateur actuellement connecté (s'il y en a un) ; elle est exécutée en s'attendant à ce qu'il n'y ait pas de sortie de console, puisqu'elle est non interactive, elle ne peut pas simplement interrompre un utilisateur connecté pour montrer la sortie, de toute façon (et s'il y a une sortie, stdin est le bitbucket/NULL, stdout et stderr sont enregistrés dans le système de journalisation) ; les espaces sont gérés en contournant le problème : le nom de la commande est pris EXACTEMENT tel quel, et les paramètres passés à la commande sont spécifiés dans une autre zone de saisie dans les propriétés de la tâche.

Ce qui signifie que votre tâche doit être exécutée comme si elle était un démon (dans le monde Un*x). Tout est statique et précis. Le nom de la commande est le nom réel de la commande, sans aucun paramètre. Cela inclut souvent l'exécution d'interprètes de commandes/scripts, tels que CMD.EXE ! Les paramètres, s'ils existent, sont spécifiés ailleurs et doivent être connus lors de la configuration de la tâche (c'est-à-dire que vous ne pouvez pas modifier les paramètres “à la volée”). Et ainsi de suite.

Donc, si vous voulez inclure des paramètres, vous devez utiliser la section des paramètres pour les spécifier. Le planificateur de tâches n'essaie pas d'analyser le nom de la commande pour la diviser en “command” et “args” comme le font les programmes en ligne de commande. Il le traite simplement comme un grand nom de commande complet. De même, si vous voulez des paramètres variables, comme l'utilisation de %1 … %n dans les fichiers BATCH, vous ne pouvez pas le faire à partir du planificateur de tâches lui-même ; vous devrez trouver un autre moyen. (Notez que vous ne pouvez pas non plus utiliser de variables d'environnement, puisque l'environnement transmis au programme dépend de l'environnement avec lequel la tâche est lancée, et NON de l'environnement “actuel”). Vous pourriez utiliser un fichier temporaire pour enregistrer les paramètres, mais puisque vous devez spécifier un nom de fichier statique dans les propriétés de la tâche, que se passe-t-il lorsque vous êtes sur un réseau de 5000 utilisateurs et que quatre d'entre eux essaient d'exécuter la même tâche en même temps ? Ils vont tous s'affronter en essayant d'écrire dans le même fichier temporaire en même temps, ce qui n'est probablement pas non plus ce que vous vouliez. (Il y a aussi des solutions à ce problème, mais cela dépasse trop le cadre de cette question et de cette réponse).

Donc, réponse finale : Dans le cas simple – le chemin que vous voulez passer en paramètre est statique et ne change pas – vous devez soit spécifier les paramètres dans la propriété appropriée de la tâche (Arguments) plutôt que dans la boîte Program/Script, soit utiliser un fichier batch. Dans un cas plus complexe – vous devrez poser la bonne question ou faire des recherches sur le fonctionnement des démons et sur l'utilisation des verrouillages/sémaphores et autres pour la communication inter-processus (IPC).

Bonne chance.

-1
-1
-1
2019-06-27 16:39:40 +0000

Microsoft a publié un bulletin à ce sujet https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

Fondamentalement, il indique d'utiliser la séquence “\” avant et après le nom du fichier de lot.