J'ai besoin de configurer une tâche planifiée Windows. Il accepte 1 paramètre / argument qui est un chemin d'accès et peut contenir des espaces. Ma tâche planifiée ne fonctionne pas - elle "casse" le paramètre au premier espace.
Si je l'exécute dans l'invite de commandes, je peux simplement envelopper l'argument dans "" et cela fonctionne bien, cependant, cela ne fonctionne pas dans l'interface utilisateur de la tâche planifié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 créer 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 ne semble pas y avoir de discussions à ce sujet?
la source
Réponses:
J'ai travaillé avec des tâches planifiées et vous mettez généralement les arguments dans sa propre zone de saisie de texte. Cela signifie que vous pointez l'action vers le champ programme / script pointe vers l'exe et le champ "Ajouter des arguments" doit avoir tous les paramètres. ( source )
Je crois que ce comportement a été ajouté pour empêcher les espaces dans le chemin d'accès au fichier exe de causer des problèmes.
Je le fais tout le temps avec des scripts PowerShell. Voici un exemple:
la source
Notez l'utilisation de
'
dans le chemin d'accès d'un fichier à exécuter.la source
Dans ce cas, vous pouvez contourner le problème en passant votre paramètre de chemin au format 8.3.
Vous pouvez découvrir le format 8.3 pour votre chemin en ouvrant une invite de commande et en émettant la commande
dir /x
à la racine de votre lecteur.Vous devriez voir une entrée similaire à
pour votre répertoire Program Files.
Ensuite, changez le répertoire en Program Files avec
cd "Program Files
"suivi de cd xyz et lancez àdir /x
nouveau pour trouver le nom de format 8.3 pour" L'interface ", et ainsi de suite.Votre chemin final pour l'exemple que vous avez donné ressemblerait à quelque chose comme:
la source
J'ai eu un problème similaire avec VLC, que j'utilisais sous Windows XP. L'astuce consiste à placer l'argument de la
cmd
commande entre guillemets.Voici un exemple de ce que j'ai utilisé (planifier un enregistrement à 15h00):
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\..."
la source
Une façon d'y parvenir consiste à utiliser PowerShell à partir de la ligne de commande.
Ajoutez ce code à un fichier appelé MyModule.psm1.
Ensuite, à partir de la ligne de commande OU d'un fichier ps1, vous pouvez exécuter:
Chaque élément respectif du tableau des paramètres de tâche serait transmis sous la forme $ (Arg0), $ (Arg1) et $ (Arg2).
la source
Définissez votre tâche planifiée comme suit
cmd / c C: \ Program Files \ xyz \ FTP File Transfer \ FTPFileTransferTask.exe "C: \ Program Files \ xyz \ The Interface \ Folder Path"
la source
Cela pourrait aider à comprendre le problème sous un angle différent. Supposons que vous soyez le programmeur chargé d'ajouter un planificateur de tâches à Windows. Comment feriez-vous? Vous avez plusieurs problèmes à résoudre: Si la tâche est exécutée en tant que personne autre que l'utilisateur connecté, devriez-vous ennuyer l'utilisateur connecté avec des fenêtres contextuelles d'erreur? Que faire s'il n'y a aucun utilisateur connecté au moment où la tâche est exécutée? Qu'en est-il de la différence entre un programme GUI et un programme console? Les interfaces graphiques n'ont pas stdin, stdout et stderr; le concept n'a aucun sens en eux. 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 faire face maintenant ..)
Bien que je ne sois pas sûr à 100% des éléments internes ou des détails techniques complets dans ce cas, les réponses semblent être .. Les tâches sont exécutées dans une session isolée et non interactive, qui ne peut pas interagir avec l'utilisateur actuellement connecté (le cas échéant) ); Il est exécuté en s'attendant à ce qu'il n'y ait pas de sortie de console, car il n'est pas interactif, il ne peut pas simplement interrompre tout utilisateur connecté pour afficher la sortie, de toute façon (et s'il y a une sortie, stdin est le bitbucket / NULL, stdout et stderr sont connectés à l'installation de journalisation du système); 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 transmis à la commande sont spécifiés dans une autre zone de saisie dans les propriétés de la tâche.
Tout ce que cela signifie, c'est que votre tâche doit être exécutée comme si elle ressemblait à 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éteurs de commandes / scripts, tels que CMD.EXE! Les paramètres, le cas échéant, sont spécifiés ailleurs et doivent être connus lorsque vous configurez la tâche (c'est-à-dire que vous ne pouvez pas modifier les paramètres "à la volée"). Etc.
Donc, si vous souhaitez inclure des paramètres, vous devez utiliser la section paramètres pour spécifier les paramètres. Le Planificateur de tâches ne pasessayez d'analyser le nom de la commande pour le diviser en "commande" et "args" comme le font les programmes en ligne de commande. Il le traite simplement comme un gros nom de commande complet. De même, si vous voulez des paramètres variables, comme utiliser% 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, car l'environnement transmis au programme dépend de l'environnement avec lequel la tâche est démarrée, PAS de l'environnement "actuel".) Vous pouvez utiliser un fichier temporaire pour enregistrer les paramètres, mais puisque vous doit 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 avec 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'entrechoquer en essayant d'écrire dans le même fichier temporaire en même temps, probablement pas ce que vous vouliez non plus. (Il existe également des solutions à ce problème, mais cela va trop loin en dehors de la portée de cette question et réponse ..)
Donc, réponse finale: dans le cas simple - le chemin que vous souhaitez passer en tant que paramètre est statique et ne change pas - vous devez soit spécifier les paramètres dans la propriété de tâche appropriée (arguments) plutôt que dans la zone Programme / Script ou utilisez un fichier de commandes. Dans un cas plus complexe - vous devrez poser la bonne question ou rechercher comment les démons fonctionnent et comment utiliser le verrouillage / les sémaphores et autres pour la communication inter-processus (IPC).
Bonne chance.
la source
Microsoft a 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 -il-a
Fondamentalement, il dit d'utiliser la séquence "\" avant et après le nom du fichier de commandes.
la source