Het helpt misschien om het probleem vanuit een ander perspectief te bekijken… Stel dat jij de programmeur bent die de taak heeft gekregen om een taakplanner aan Windows toe te voegen. Hoe zou u dat doen? Je hebt met verschillende problemen te kampen: Als de taak wordt uitgevoerd als iemand anders dan de ingelogde gebruiker, moet je de ingelogde gebruiker dan lastig vallen met eventuele foutmeldingen? Wat als er geen ingelogde gebruiker is op het moment dat de taak wordt uitgevoerd? Hoe zit het met het verschil tussen een GUI programma en een console programma? GUI’s hebben geen stdin, stdout en stderr; het concept is bij hen zinloos. Hoe zit het met programma’s binnen of buiten COMMAND.COM/CMD.EXE? Of andere scripting engines? Hoe zit het met paden met spaties in de opdrachtnaam? Of in de parameters (opties/argumenten)? (Zoals je nu probeert aan te pakken..)
Hoewel ik niet 100% zeker ben van de internals of de volledige technische details in dit geval, lijken de antwoorden te zijn… Taken worden uitgevoerd in een geïsoleerde, niet-interactieve sessie, die geen interactie kan hebben met de huidige ingelogde gebruiker (als die er is); Het wordt uitgevoerd in de verwachting dat er geen console-uitvoer is, omdat het niet-interactief is, kan het niet zomaar een ingelogde gebruiker onderbreken om de uitvoer te laten zien, hoe dan ook (en als er uitvoer is, is stdin de bitbucket/NULL, stdout en stderr worden gelogd naar de systeem logging faciliteit); Spaces worden afgehandeld door het probleem te omzeilen: de opdrachtnaam wordt EXACTIEF genomen zoals hij is, en de parameters die aan de opdracht worden doorgegeven, worden in een ander invoerveld in de taakeigenschappen opgegeven.
Wat dit alles betekent is dat je taak moet worden uitgevoerd alsof het een daemon is (in de Un*x wereld). Alles is statisch en precies. De opdrachtnaam is de eigenlijke opdrachtnaam, zonder enige parameters. Dit omvat vaak het uitvoeren van commando/script interpreters, zoals CMD.EXE! De parameters, indien aanwezig, worden elders gespecificeerd, en moeten bekend zijn wanneer je de opdracht opzet (dat wil zeggen, je kunt de parameters niet “on-the-fly” veranderen). En zo verder.
Dus, als je parameters wilt opnemen, moet je de parameters sectie gebruiken om de parameters op te geven. De Taakplanner probeert niet de commandonaam te ontleden en op te splitsen in “commando” en “args” zoals commandoregelprogramma’s doen. Hij behandelt het gewoon als één grote, volledige opdrachtnaam. Ook als je variabele parameters wilt, zoals %1 .. %n in BATCH-bestanden, kun je dat niet vanuit de Taakplanner zelf doen; je zult een andere manier moeten vinden. (Merk op dat je ook geen omgevingsvariabelen kunt gebruiken, omdat de omgeving die aan het programma wordt doorgegeven afhankelijk is van de omgeving waarmee de taak wordt gestart, NIET van de “huidige” omgeving). U zou een tijdelijk bestand kunnen gebruiken om de parameters op te slaan, maar omdat u een statische bestandsnaam moet opgeven in de taakeigenschappen, wat gebeurt er als u op een netwerk zit met 5000 gebruikers en vier van hen proberen dezelfde taak op hetzelfde moment uit te voeren? Ze zullen elkaar allemaal platdrukken bij het schrijven naar hetzelfde tijdelijke bestand op hetzelfde moment, waarschijnlijk ook niet wat je wilde. (Er zijn ook oplossingen voor dit probleem, maar dat gaat te ver buiten het bestek van deze vraag en dit antwoord…)
Dus het laatste antwoord: In het eenvoudige geval – het pad dat je als parameter wil doorgeven is statisch en verandert niet – moet je ofwel de parameters specificeren in de juiste Task eigenschap (Arguments) in plaats van in het Program/Script vak, of een batch bestand gebruiken. In een complexer geval – zul je de juiste vraag moeten stellen of onderzoeken hoe daemons werken en hoe je locking/semaphores en dergelijke kunt gebruiken voor inter-proces communicatie (IPC).
Veel geluk.