So übergeben Sie ein Argument an eine geplante Windows-Task mit Leerzeichen

109115
Rodney

Ich muss eine geplante Windows-Task einrichten. Es akzeptiert 1 Parameter / Argument, das ein Pfad ist und Leerzeichen enthalten kann. Meine geplante Aufgabe funktioniert nicht - sie "bricht" den Parameter an der ersten Stelle 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 Task-Benutzeroberfläche.

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 "" '' [] () einzuwickeln, und habe versucht, die Leerzeichen mit% 20, ~ 1 usw. ohne Glück zu füllen.

Ich kenne eine Lösung, um eine Fledermausdatei zu erstellen und um "" meine Argumente 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?

13
Setzen Sie das Argument in den Abschnitt ** Programm / Skript ** oder ** Argumente hinzufügen (optional) **, wenn Sie die geplante Aufgabe bearbeiten? William Jackson vor 12 Jahren 1
Es wäre hilfreich, wenn Sie genau angeben würden, welches Programm Sie verwenden, da das richtige Umschreiben von Argumenten im Ermessen des Programms liegt und nicht in "Scheduled Taks". WinSCP erwartet beispielsweise doppelte Anführungszeichen ("" ... ""), wenn Sie Anführungszeichen verschachteln müssen. Tobias Plutat vor 12 Jahren 0
Es ist ziemlich unklar in Bezug auf 1) was scheitert, die Aufgabe oder Ihre .exe-Datei, und 2) genau was Sie eingegeben haben und wo in der TaskSched-Benutzeroberfläche. Könnte es sein, dass wenn TaskSched nach einem Befehl fragt (vollständiger Pfad zur ausführbaren Datei), Sie versuchen, ihm eine Befehlszeile zu geben (eine ganz andere Sache)? kreemoweet vor 12 Jahren 0
Warum gegen Batchdatei? Das macht die Sache so einfach! Oder Sie können nach einem Powershell-Skript filmen, wenn Sie sich abenteuerlich fühlen. tumchaaditya vor 10 Jahren 0

7 Antworten auf die Frage

5
Doltknuckle

Ich habe mit geplanten Aufgaben gearbeitet, und Sie legen die Argumente im Allgemeinen in ein eigenes Texteingabefeld. Das bedeutet, dass Sie die Aktion auf das Programm- / Skriptfeld zeigen, auf das Exe zeigt und das Feld "Argumente hinzufügen" alle Parameter enthalten sollte. ( Quelle )

Blog-Bild

Ich glaube, dieses Verhalten wurde hinzugefügt, um zu verhindern, dass Leerzeichen im Dateipfad zur Exe Probleme verursachen.

Ich mache dies die ganze Zeit mit PowerShell-Skripts. Hier ist ein Beispiel:

  • Programm / Skript: powershell.exe
  • Fügen Sie Argumente hinzu : -command "& 'C: \ HSD - Copy \ logoffstudents.ps1'" -NonInteractive
  • Beginnen Sie in: Blank
Danke, aber das Problem ist, dass einer meiner Paramater einen Dateipfad IST (und ein Leerzeichen enthält). In Ihrem Beispiel wird also 100 funktionieren, aber wenn Sie "C: \ Start Folder" übergeben wollten? Rodney vor 12 Jahren 0
Ich verwende nur Anführungszeichen in meinen Programmen und es funktioniert. Das kaufmännische Und-Zeichen ist nur bei Powershell erforderlich. Dieses Symbol ist der CALL-Operator und ermöglicht es mir, einen Powershell-Befehl aufzurufen. In den meisten Fällen reicht das Angebot aus. An diesem Punkt möchten Sie vielleicht mit dem Ersteller des Exe Kontakt aufnehmen, um zu sehen, ob er geplante Aufgaben unterstützt. Ich bin auf ein paar seltene Programme gestoßen, die sich einfach weigern, als geplante Aufgabe auszuführen. Ich denke, dass es subtile Unterschiede gibt, wie die Parameter übergeben werden, die Probleme verursachen können. Entschuldigung, ich kann nicht mehr helfen. Doltknuckle vor 12 Jahren 0
Im schlimmsten Fall können Sie den Ordner umstrukturieren, um die Leerzeichen zu entfernen. Es ist nicht das, was Sie wollen, aber es könnte der einzige Weg sein, damit es funktioniert. Doltknuckle vor 12 Jahren 0
Vielen Dank Doltknuckle - Ich weiß, ich könnte es auch mit einer .bat-Datei tun (und "" mit dem Parameter "" "verwenden (wie Sie es im Powershell-Skript tun. Ich bin sicher, es ist ein Fehler in der Benutzeroberfläche des Windows Task-Editors ...) bin der Schöpfer der .exe;) - Funktioniert gut über einen Test-Harness und über die Eingabeaufforderung, aber nicht über die Windows-Benutzeroberfläche ... Rodney vor 12 Jahren 0
Wenn Sie das Exe erstellt haben, kann dies eine Frage für Stackoverflow sein. Ich habe das Gefühl, dass Sie Ihre Parameterbehandlung möglicherweise ändern müssen, wenn dieses Exe mit einer geplanten Task verwendet wird. Ein Vorschlag ist, dass Ihr exe die in einer Datei erhaltenen Parameter protokolliert, damit Sie sehen können, was übergeben wird. Damit können Sie zumindest feststellen, ob die geplanten Task-Parameter mit den Befehlszeilenparametern übereinstimmen. Doltknuckle vor 12 Jahren 1
Ich habe es geschafft, die Lösung durch das Lesen dieser Antwort hervorzuheben, aber die Antwort von Aman Mehra ist klarer. Verwenden Sie ein einfaches Anführungszeichen in doppelten Anführungszeichen, um die Frage zu lösen. Der Grund, warum es funktioniert, besteht darin, dass bei der Analyse der Argumente die doppelten Anführungszeichen entfernt werden, die inneren Anführungszeichen jedoch für die ausführbare Datei unverändert bleiben. carlin.scott vor 7 Jahren 0
4
Aman Mehra
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" 

Note the use of ' in the path of a file to be run.

2
Keith

In diesem Fall können Sie das Problem umgehen, indem Sie den 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 /xim Stammverzeichnis des Laufwerks ausgeben .

Sie sollten einen Eintrag ähnlich wie sehen

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

für Ihr Programmverzeichnis.

Wechseln Sie dann in das Verzeichnis "Programme cd "Program Files" mit "gefolgt von cd xyz", und geben Sie dir /xerneut das 8.3-Format für "The Interface" ein.

Ihr letzter Weg für das von Ihnen gegebene Beispiel würde ungefähr so ​​aussehen:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1 
Danke, ich schätze die Antwort, dies verursacht jedoch weitere Probleme. Im Grunde rufe ich eine EXE-.NET-App auf, die ich geschrieben habe, die diesen Parameterordnerpfad für etwas verwendet - sie mag das 8.3-Format nicht und kann den Pfad nicht finden. Gibt es eine andere Möglichkeit, dies zu tun? Rodney vor 13 Jahren 0
ps - Ist dies ein Fehler in der Windows-Task für geplante Aufgaben? Räume sind sehr häufig! Rodney vor 13 Jahren 0
Ein kurzer Test unter Windows 7 funktioniert für mich. Können Sie uns durch die Schritte gehen, die Sie zur Einrichtung der Aufgabe unternommen haben, da es verschiedene Möglichkeiten gibt. Danke für die Bearbeitung dort Gareth, sieht viel schöner aus. Keith vor 13 Jahren 0
Die Task wird also mit dieser Formatierung in Ordnung ausgeführt, aber mein .NET-Programm (das den Pfad als Argumentstring akzeptiert) dekomprimiert den Pfad nicht aus dem 8.3-Format. Also ist es vielleicht eine Programmierfrage - wie geht man mit 8.3-Pfaden um? Rodney vor 13 Jahren 0
Ich kenne das schon alt, aber haben Sie einen Bindestrich (-) versucht? Chibueze Opata vor 11 Jahren 0
1
tomatoma

Ich hatte ein ähnliches Problem mit VLC, das ich unter Windows XP verwendete. Der Trick besteht darin, das Argument des cmdBefehls in doppelte Anführungszeichen zu setzen.

Hier ist ein Beispiel für das, was ich verwendet habe (Aufnahme um 15:00 Uhr geplant):

um 15:00 cmd / c "" C: \ Programmi \ VideoLAN \ VLC \ vlc.exe dvb-t: // Frequenz = 698000000: Programm = 4006: Laufzeit = 5 --sout "C: \ Dokumente und Einstellungen \ Benutzername \ Dokumente \ Video \ VLC \ test.mpg "" "

Beachten Sie die Verwendung von doppelten Anführungszeichen unmittelbar nach /cund am Ende des Befehls (nach .mpg). Das Argument mit Leerzeichen lautet in diesem Fall"C:\Documents and Settings\..."

1
C. M.

Es könnte hilfreich sein, das Problem aus einer anderen Perspektive zu verstehen. Nehmen wir an, Sie sind der Programmierer, der mit dem Hinzufügen eines Task-Schedulers zu Windows beauftragt wurde. Wie würdest du es machen? Sie haben mehrere Probleme, mit denen Sie sich auseinandersetzen müssen: Wenn die Aufgabe von einem anderen Benutzer als dem angemeldeten Benutzer ausgeführt wird, sollten Sie den angemeldeten Benutzer mit Fehler-Popups belästigen? Was ist, wenn zum Zeitpunkt der Aufgabe kein Benutzer angemeldet ist? Was ist der Unterschied zwischen einem GUI-Programm und einem Konsolenprogramm? GUIs haben nicht stdin, stdout und stderr; Das Konzept ist in ihnen bedeutungslos. Was ist mit Programmen, die intern oder extern für COMMAND.COM/CMD.EXE sind? Oder andere Scripting Engines? Wie sieht es mit Pfaden mit Leerzeichen im Befehlsnamen aus? Oder in den Parametern (Optionen / Argumente)? (Wie Sie jetzt zu beschäftigen versuchen ..)

Ich bin mir in diesem Fall nicht absolut sicher über die Interna oder die vollständigen technischen Details, aber die Antworten scheinen zu sein. Die Aufgaben werden in einer isolierten, nicht interaktiven Sitzung ausgeführt, die nicht mit dem aktuell angemeldeten Benutzer interagieren kann (falls vorhanden) ); Es wird erwartet, dass keine Konsolenausgabe vorhanden ist. Da es nicht interaktiv ist, kann es jeden angemeldeten Benutzer nicht unterbrechen, um die Ausgabe anzuzeigen. Wenn es Ausgabe gibt, ist stdin der Bitbucket / NULL-Befehl, stdout und stderr werden angemeldet die Systemprotokollierungseinrichtung); Leerzeichen werden durch Umgehen des Problems gehandhabt: Der Befehlsname wird exakt übernommen, und die Parameter werden an den Befehl übergeben. Sie werden in einem anderen Eingabefeld in den Task-Eigenschaften angegeben.

Was bedeutet, dass Ihre Aufgabe so ausgeführt werden muss, als wäre sie ein Dämon (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- / Skriptinterpreter wie CMD.EXE! Die Parameter, sofern vorhanden, sind an anderer Stelle angegeben und müssen bekannt sein, wenn Sie die Task einrichten (dh Sie können die Parameter nicht "on-the-fly" ändern). Und so weiter.

Wenn Sie also Parameter einschließen möchten, müssen Sie die Parameter mit dem Parameterabschnitt angeben. Der Taskplaner tut dies nichtVersuchen Sie, den Befehlsnamen zu parsen, um ihn in "command" und "args" aufzuteilen, wie dies Befehlszeilenprogramme tun. Es behandelt es einfach als einen großen, vollständigen Befehlsnamen. Wenn Sie variable Parameter wünschen, wie 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 die Task gestartet wird, NICHT von der "aktuellen" Umgebung.) Sie können eine temporäre Datei verwenden, um die Parameter zu speichern, jedoch von Ihnen Sie müssen einen statischen Dateinamen in den Task-Eigenschaften angeben. Was passiert, wenn Sie sich in einem Netzwerk mit 5000 Benutzern befinden und vier von ihnen versuchen, dieselbe Task gleichzeitig auszuführen? Sie werden sich alle gegenseitig beschimpfen 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 entweder die Parameter in der entsprechenden Task-Eigenschaft (Argumente) angeben, anstatt im Feld Programm / Skript oder verwenden Sie eine Batchdatei. In einem komplexeren Fall müssen Sie die richtige Frage stellen oder nachforschen, wie Dämonen funktionieren und wie Sperren / Semaphore und dergleichen für die Kommunikation zwischen Prozessen (IPC) verwendet werden.

Viel Glück.

1
SpaceGhost440

Eine Möglichkeit, dies zu erreichen, ist die Verwendung der Powershell von der Befehlszeile aus.

Fügen Sie diesen Code einer Datei mit dem Namen MyModule.psm1 hinzu.

$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-*" 

Dann können Sie über die Befehlszeile ODER eine ps1-Datei ausführen:

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) 

Jedes entsprechende Element im taskparameters-Array wird als $ (Arg0), $ (Arg1) und $ (Arg2) übergeben.

0
incognito

Legen Sie Ihre geplante Aufgabe wie folgt fest

cmd / c C: \ Programme \ xyz \ FTP-Dateiübertragung \ FTPFileTransferTask.exe "C: \ Programme \ xyz \ Die Schnittstelle \ Ordnerpfad"