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

15

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?

Rodney
la source
1
Placez-vous l'argument dans la section Programme / script ou la section Ajouter des arguments (facultatif) lorsque vous modifiez la tâche planifiée?
William Jackson
Il serait utile que vous spécifiiez le programme que vous utilisez exactement, car le bon encapsulage des arguments est à la discrétion du programme et non de Taks planifiés. WinSCP, par exemple, attend des guillemets doubles ("" ... "") lorsque vous devez imbriquer des guillemets.
Tobias Plutat
Il est assez difficile de savoir 1) ce qui échoue, la tâche ou votre .exe, et 2) exactement ce que vous avez entré et où dans l'interface utilisateur TaskSched. Serait-ce que lorsque TaskSched demande une commande (chemin complet vers l'exécutable), vous essayez de lui donner une ligne de commande (chose très différente)?
kreemoweet
Pourquoi contre le fichier batch? Cela rend les choses si simples! Ou vous pouvez tirer pour le script PowerShell si vous vous sentez aventureux ..
tumchaaditya

Réponses:

6

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 )

Image du blog

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:

  • Programme / script: powershell.exe
  • Ajoutez des arguments : -command "& 'C: \ HSD - Copy \ logoffstudents.ps1'" -NonInteractive
  • Commencer dans: vide
Doltknuckle
la source
Merci, mais le problème est que l'un de mes paramètres est un chemin de fichier (et contient un espace). Ainsi, dans votre exemple, 100 fonctionnera, mais que se passe-t-il si vous souhaitez passer "C: \ Start Folder"?
Rodney
J'utilise juste des guillemets dans mes programmes et ça marche. L'esperluette n'est requise qu'avec PowerShell. Ce symbole est l'opérateur CALL et me permet d'afficher une commande powershell. Dans la plupart des cas, les devis sont tout ce dont vous avez besoin. À ce stade, vous pouvez envisager de contacter le créateur de l'exe pour voir s'il prend en charge les tâches planifiées. J'ai rencontré quelques rares programmes qui refusent simplement de s'exécuter en tant que tâche planifiée. Je pense qu'il existe des différences subtiles sur la façon dont les paramètres sont passés qui peuvent causer des problèmes. Désolé, je ne peux pas vous aider davantage.
Doltknuckle
Au pire, vous pouvez restructurer le dossier pour éliminer les espaces. Ce n'est pas ce que vous voulez, mais cela pourrait être le seul moyen de le faire fonctionner.
Doltknuckle
Merci Doltknuckle - Je sais que je pourrais aussi le faire avec un fichier .bat (et utiliser "" autour du param (comme vous le faites dans le script Powershell. Je suis sûr que c'est un bogue dans l'interface utilisateur de l'éditeur de tâches Windows ... (I suis le créateur du .exe;) - Il fonctionne très bien via un harnais de test et à partir de l'invite de commande mais pas via l'interface utilisateur Windows ...
Rodney
1
Si vous avez créé l'exe, cela peut être une question pour stackoverflow. J'ai le sentiment que vous devrez peut-être modifier la gestion de vos paramètres lorsque cet exe est utilisé avec une tâche planifiée. Une suggestion est d'avoir votre exe journal les paramètres reçus dans un fichier afin que vous puissiez voir ce qui est passé. Cela vous permettrait au moins de voir si les paramètres de tâche planifiée sont les mêmes que les paramètres de ligne de commande.
Doltknuckle
6
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'accès d'un fichier à exécuter.

Aman Mehra
la source
3

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 à

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

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 /xnouveau 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:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1
Keith
la source
Merci, j'apprécie la réponse, mais cela pose d'autres problèmes. Fondamentalement, j'appelle une application EXE .NET que j'ai écrite qui utilise ce chemin de dossier param pour quelque chose - elle n'aime pas le format 8.3 et ne peut pas trouver le chemin. Alors, y a-t-il une autre façon de procéder?
Rodney
ps - Alors, est-ce un bug dans l'application Windows Scheduled Task? Les espaces sont très courants!
Rodney
Un test rapide sur Windows 7 fonctionne pour moi. Pouvez-vous nous expliquer les étapes que vous avez suivies pour mettre en place la tâche, comme il existe de différentes manières. Merci pour la retouche là-bas Gareth, ça a l'air beaucoup plus agréable.
Keith
La tâche s'exécute donc correctement avec cette mise en forme, mais mon programme .NET (qui accepte le chemin d'accès en tant que chaîne d'argument) ne décompresse pas le chemin d'accès au format 8.3. Alors peut-être que c'est une question de programmation - comment gérer les chemins 8.3?
Rodney
Je sais que nous sommes vieux, mais avez-vous essayé le trait d'union (-)?
Chibueze Opata
1

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

Voici un exemple de ce que j'ai utilisé (planifier un enregistrement à 15h00):

à 15:00 cmd / c "" C: \ Programmi \ VideoLAN \ VLC \ vlc.exe dvb-t: // fréquence = 698000000: programme = 4006: run-time = 5 --sout "C: \ Documents and Settings \ UserName \ Documents \ Video \ VLC \ test.mpg "" "

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

tomatoma
la source
1

Une façon d'y parvenir consiste à utiliser PowerShell à partir de 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-*"

Ensuite, à 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 tâche serait transmis sous la forme $ (Arg0), $ (Arg1) et $ (Arg2).

SpaceGhost440
la source
0

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"

incognito
la source
0

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.

CM
la source