Ich muss eine geplante Windows-Aufgabe einrichten. Es akzeptiert 1 Parameter / Argument, das ein Pfad ist und Leerzeichen enthalten kann. Meine geplante Aufgabe funktioniert nicht - sie "bricht" den Parameter beim ersten Leerzeichen auf.
Wenn ich es in der Eingabeaufforderung ausführe, kann ich das Argument einfach in "" einschließen und es funktioniert einwandfrei. Dies funktioniert jedoch nicht in der Benutzeroberfläche für geplante Tasks.
z.B C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"
Ich habe versucht, das Argument mit "" '' [] () zu umschließen und habe versucht, die Leerzeichen mit% 20, ~ 1 usw. zu füllen, ohne Erfolg.
Ich kenne eine Lösung, um eine Fledermausdatei zu erstellen und "" um mein Argument herum zu verwenden, aber ich möchte nicht mehr Komplexität hinzufügen.
Ich habe es unter Windows 7 und Windows 2008 Server versucht und beide sind fehlgeschlagen. Es scheint keine Diskussionen darüber zu geben?
quelle
Antworten:
Ich habe mit geplanten Aufgaben gearbeitet und Sie haben die Argumente im Allgemeinen in ein eigenes Texteingabefeld eingegeben. Dies bedeutet, dass Sie die Aktion auf das Programm- / Skriptfeld verweisen und dass das Feld "Argumente hinzufügen" alle Parameter enthalten sollte. ( Quelle )
Ich glaube, dieses Verhalten wurde hinzugefügt, um zu verhindern, dass Leerzeichen im Dateipfad zur exe Probleme verursachen.
Ich mache das die ganze Zeit mit PowerShell-Skripten. Hier ist ein Beispiel:
quelle
Beachten Sie die Verwendung von
'
im Pfad einer auszuführenden Datei.quelle
In diesem Fall können Sie das Problem umgehen, indem Sie Ihren Pfadparameter im 8.3-Format übergeben.
Sie können das 8.3-Format für Ihren Pfad ermitteln, indem Sie eine Eingabeaufforderung öffnen und den Befehl
dir /x
im Stammverzeichnis Ihres Laufwerks eingeben.Sie sollten einen ähnlichen Eintrag sehen wie
für Ihr Programmverzeichnis.
Wechseln Sie dann mit
cd "Program Files
"gefolgt von cd xyz" in das Verzeichnis "Programme " und geben Sie esdir /x
erneut aus, um den 8.3-Formatnamen für "The Interface" usw. zu finden.Ihr letzter Pfad für das Beispiel, das Sie gegeben haben, würde ungefähr so aussehen:
quelle
Ich hatte ein ähnliches Problem mit VLC, das ich unter Windows XP verwendete. Der Trick besteht darin, das Argument des
cmd
Befehls in doppelte Anführungszeichen zu setzen.Hier ist ein Beispiel dessen, was ich verwendet habe (Planen einer Aufnahme um 15:00 Uhr):
Beachten Sie die Verwendung von doppelten Anführungszeichen unmittelbar nach
/c
und am Ende des Befehls (nach.mpg
). Das Argument mit Leerzeichen ist in diesem Fall"C:\Documents and Settings\..."
quelle
Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Powershell über die Befehlszeile.
Fügen Sie diesen Code einer Datei mit dem Namen MyModule.psm1 hinzu.
Dann können Sie über die Befehlszeile ODER eine ps1-Datei ausführen:
Jedes entsprechende Element im taskparameters-Array wird als $ (Arg0), $ (Arg1) und $ (Arg2) übergeben.
quelle
Stellen Sie Ihre geplante Aufgabe wie folgt ein
cmd / c C: \ Programme \ xyz \ FTP-Dateiübertragung \ FTPFileTransferTask.exe "C: \ Programme \ xyz \ Die Benutzeroberfläche \ Ordnerpfad"
quelle
Es könnte hilfreich sein, das Problem aus einer anderen Perspektive zu verstehen. Nehmen wir an, Sie sind der Programmierer, der damit beauftragt wurde, Windows einen Taskplaner hinzuzufügen. Wie würdest du es machen? Sie haben verschiedene Probleme: Wenn die Aufgabe nicht als angemeldeter Benutzer ausgeführt wird, sollten Sie den angemeldeten Benutzer mit Fehler-Popups belästigen? Was ist, wenn zum Zeitpunkt der Taskausführung kein Benutzer angemeldet ist? Was ist mit dem Unterschied zwischen einem GUI-Programm und einem Konsolenprogramm? GUIs haben kein stdin, kein stdout und kein stderr; Das Konzept ist in ihnen bedeutungslos. Was ist mit internen oder externen Programmen für COMMAND.COM/CMD.EXE? Oder andere Scripting Engines? Was ist mit Pfaden mit Leerzeichen im Befehlsnamen? Oder in den Parametern (Optionen / Argumente)? (Wie Sie versuchen, jetzt zu beschäftigen ..)
Obwohl ich in diesem Fall nicht 100% sicher bin, ob es sich um interne oder technische Details handelt, scheinen die Antworten zu lauten. Aufgaben werden in einer isolierten, nicht interaktiven Sitzung ausgeführt, die nicht mit dem derzeit angemeldeten Benutzer (falls vorhanden) interagieren kann ); Es läuft in der Erwartung, dass es keine Konsolenausgabe gibt, da es nicht interaktiv ist. Es kann jeden angemeldeten Benutzer sowieso nicht unterbrechen, um die Ausgabe anzuzeigen die Systemprotokollierungsanlage); Leerzeichen werden behandelt, indem das Problem umgangen wird: Der Befehlsname wird EXAKT so wie er ist verwendet, und Parameter, die an den Befehl übergeben werden, werden in einem anderen Eingabefeld in den Task-Eigenschaften angegeben.
Das heißt, Ihre Aufgabe muss wie ein Dämon ausgeführt werden (in der Un * x-Welt). Alles ist statisch und präzise. Der Befehlsname ist der tatsächliche Befehlsname ohne Parameter. Dies beinhaltet häufig das Ausführen von Befehls / Skript-Interpretern, wie z. B. CMD.EXE! Die Parameter, falls vorhanden, werden an anderer Stelle angegeben und müssen beim Einrichten der Task bekannt sein (dh, Sie können die Parameter nicht "on-the-fly" ändern). Und so weiter.
Wenn Sie also Parameter einbeziehen möchten, müssen Sie den Parameterabschnitt verwenden, um die Parameter anzugeben. Der Taskplaner funktioniert nichtVersuchen Sie, den Befehlsnamen zu analysieren, um ihn in "command" und "args" zu unterteilen, wie dies Befehlszeilenprogramme tun. Es wird nur als ein großer, vollständiger Befehlsname behandelt. Wenn Sie variable Parameter möchten, z. B.% 1 ..% n in BATCH-Dateien, können Sie dies nicht über den Taskplaner selbst tun. Du musst einen anderen Weg finden. (Beachten Sie, dass Sie auch keine Umgebungsvariablen verwenden können, da die an das Programm übergebene Umgebung von der Umgebung abhängt, mit der der Task gestartet wird, NICHT von der "aktuellen" Umgebung.) Sie könnten eine temporäre Datei verwenden, um die Parameter zu speichern In den Task-Eigenschaften muss ein statischer Dateiname angegeben werden. Was passiert, wenn Sie sich in einem Netzwerk mit 5000 Benutzern befinden und vier von ihnen versuchen, denselben Task gleichzeitig auszuführen? Sie alle quälen sich gegenseitig und versuchen gleichzeitig, in dieselbe temporäre Datei zu schreiben. wahrscheinlich auch nicht das, was du wolltest. (Es gibt auch Lösungen für dieses Problem, aber das geht zu weit über den Rahmen dieser Frage und Antwort hinaus.)
Endgültige Antwort: Im einfachen Fall - der Pfad, den Sie als Parameter übergeben möchten, ist statisch und ändert sich nicht - müssen Sie die Parameter entweder in der entsprechenden Task-Eigenschaft (Argumente) und nicht im Feld Programm / Skript angeben oder verwenden Sie eine Batch-Datei. In einem komplexeren Fall müssen Sie die richtige Frage stellen oder untersuchen, wie Dämonen funktionieren und wie Sperren / Semaphoren und dergleichen für die prozessübergreifende Kommunikation (IPC) verwendet werden.
Viel Glück.
quelle
Microsoft hat ein Bulletin dazu: https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create -es-a
Grundsätzlich heißt es, die Reihenfolge "\" vor und nach dem Namen der Batch-Datei zu verwenden.
quelle