2011-04-14 05:24:06 +0000 2011-04-14 05:24:06 +0000
15
15

So übergeben Sie ein Argument mit Leerzeichen an einen geplanten Windows-Task

Ich muss einen geplanten Windows-Task einrichten. Er akzeptiert 1 Parameter/Argument, das ein Pfad ist und Leerzeichen enthalten kann. Mein geplanter Task funktioniert nicht - er “bricht” den Parameter am ersten Leerzeichen ab.

Wenn ich ihn in der Eingabeaufforderung ausführe, kann ich das Argument einfach in “ ” einschließen und es funktioniert einwandfrei, aber in der Benutzeroberfläche des geplanten Tasks funktioniert das nicht.

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 “ ” ‘ ’ einzuschließen und habe versucht, die Leerzeichen mit %20, ~1 usw. auszufüllen - ohne Erfolg.

Ich weiß von einer Lösung, eine Bat-Datei zu erstellen und “ ” um mein Argument herum zu verwenden, aber ich möchte nicht noch mehr Komplexität hinzufügen.

Ich habe es unter Windows 7 und Windows 2008 Server versucht und beide schlugen fehl. Es scheint keine Diskussionen zu diesem Thema zu geben?

Antworten (8)

6
6
6
2016-04-12 05:46:09 +0000
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"

Beachten Sie die Verwendung von ' im Pfad einer auszuführenden Datei.

6
6
6
2011-05-19 20:24:00 +0000

Ich habe mit geplanten Aufgaben gearbeitet und Sie setzen die Argumente im Allgemeinen in ein eigenes Texteingabefeld. Das bedeutet, dass Sie die Aktion auf das Programm/Skriptfeld zeigt auf die Exe und das Feld “Add Arguments” sollte alle Parameter haben. (Quelle: (http://technet.microsoft.com/en-us/library/cc770904.aspx))

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

Ich mache das ständig mit PowerShell-Skripten. Hier ist ein Beispiel:

  • Programm/Skript: powershell.exe
  • Argumente hinzufügen : -command “& ‘C:\HSD - Copy\logoffstudents.ps1’ ” -NichtInteraktiv
  • Start in: Leer
3
3
3
2011-04-14 06:31:15 +0000

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 Eintrag ähnlich wie

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

für Ihr Programmverzeichnis sehen.

Wechseln Sie dann mit cd "Program Files“ in das Verzeichnis "Programme”, gefolgt von cd xyz und geben Sie erneut dir /x ein, um den Namen für “The Interface” im 8.3-Format zu finden, und so weiter.

Ihr endgültiger Pfad für das von Ihnen angegebene Beispiel würde etwa so aussehen:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1
1
1
1
2013-10-27 22:45:45 +0000

Ich hatte ein ähnliches Problem mit VLC, das ich unter Windows XP verwendet habe. Der Trick besteht darin, das Argument ](http://ss64.com/nt/cmd.html) des cmd-Befehls in doppelte Anführungszeichen einzuschließen.

Hier ist ein Beispiel, was ich verwendet habe (Planung einer Aufnahme um 15:00):

um 15:00 cmd /c “"C:\Programmi\VideoLAN\VLC\vlc.exe dvb-t://frequency=698000000 :program=4006 :run-time=5 –sout "C:\Dokumente und Einstellungen\Benutzername\Dokumente\Video\VLC\test.mpg”“”

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

1
1
1
2017-02-15 13:27:49 +0000

Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Powershell über die Befehlszeile.

Fügen Sie diesen Code in eine Datei namens MyModule.psm1 ein.

$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önnten 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 Array “taskparameters” würde als $(Arg0), $(Arg1) und $(Arg2) übergeben werden.

0
0
0
2014-04-28 13:52:02 +0000

Stellen Sie die geplante Aufgabe wie folgt ein:

cmd /c C:\Programme\xyz\FTP File Transfer\FTPFileTransferTask.exe “C:\Programme\xyz\Das Interface\Ordnerpfad”

0
0
0
2015-04-20 19:48:47 +0000

Es könnte helfen, das Problem aus einer anderen Perspektive zu verstehen. Nehmen wir an, Sie sind der Programmierer, der damit beauftragt wurde, einen Taskplaner zu Windows hinzuzufügen. Wie würden Sie das tun? Sie müssen sich mit mehreren Problemen auseinandersetzen: Wenn die Aufgabe als ein anderer als der angemeldete Benutzer ausgeführt wird, sollen Sie den angemeldeten Benutzer mit irgendwelchen Fehler-Popups belästigen? Was ist, wenn es zum Zeitpunkt der Ausführung des Tasks keinen angemeldeten Benutzer gibt? Was ist der Unterschied zwischen einem GUI-Programm und einem Konsolenprogramm? GUI’s haben kein stdin, stdout und stderr; das Konzept ist bei ihnen sinnlos. Was ist mit Programmen innerhalb oder außerhalb von COMMAND.COM/CMD.EXE? Oder anderen Scripting-Engines? Was ist mit Pfaden mit Leerzeichen im Befehlsnamen? Oder in den Parametern (Optionen/Argumente)? (So wie Sie jetzt versuchen, damit umzugehen…)

Ich bin mir zwar nicht 100%ig sicher, was die Interna oder alle technischen Details in diesem Fall angeht, aber die Antworten scheinen zu sein. Tasks werden in einer isolierten, nicht-interaktiven Sitzung ausgeführt, die nicht mit dem aktuell angemeldeten Benutzer interagieren kann (falls vorhanden); Es wird in der Erwartung ausgeführt, dass es keine Konsolenausgabe gibt, da es nicht-interaktiv ist, kann es nicht einfach jeden angemeldeten Benutzer unterbrechen, um die Ausgabe zu zeigen (und wenn es eine Ausgabe gibt, ist stdin das Bitbucket/NULL, stdout und stderr werden in der Systemprotokollierung protokolliert); Leerzeichen werden durch Umgehung der Ausgabe behandelt: Der Befehlsname wird EXAKT so übernommen, wie er ist, und die Parameter, die an den Befehl übergeben werden, werden in einem anderen Eingabefeld in den Task-Eigenschaften angegeben.

Was das alles bedeutet, ist, dass Ihr Task wie ein Daemon (in der Un*x-Welt) ausgeführt werden muss. Alles ist statisch und präzise. Der Befehlsname ist der eigentliche Befehlsname, ohne jegliche Parameter. Dies schließt oft das Ausführen von Befehls-/Skriptinterpretern ein, wie z. B. CMD.EXE! Die Parameter, falls vorhanden, werden an anderer Stelle angegeben und müssen bekannt sein, wenn Sie die Aufgabe einrichten (d. h. Sie können die Parameter nicht “on-the-fly” ändern). Und so weiter.

Wenn Sie also Parameter einbeziehen wollen, müssen Sie den Abschnitt Parameter verwenden, um die Parameter anzugeben. Der Taskplaner versucht nicht, den Befehlsnamen zu analysieren, um ihn in “command” und “args” aufzuteilen, wie es Kommandozeilenprogramme tun. Er behandelt ihn einfach als einen großen, vollständigen Befehlsnamen. Wenn Sie variable Parameter verwenden möchten, wie z. B. %1 … %n in BATCH-Dateien, können Sie dies nicht über den Taskplaner selbst tun; Sie müssen 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 zum Speichern der Parameter verwenden, aber da Sie in den Task-Eigenschaften einen statischen Dateinamen angeben müssen, was passiert, wenn Sie sich in einem Netzwerk mit 5000 Benutzern befinden und vier von ihnen versuchen, denselben Task gleichzeitig auszuführen? Sie werden sich alle gegenseitig in die Quere kommen, wenn sie versuchen, gleichzeitig in dieselbe temporäre Datei zu schreiben, was wahrscheinlich auch nicht das ist, was Sie wollten. (Auch für dieses Problem gibt es Lösungen, aber das würde den Rahmen dieser Frage und Antwort sprengen…)

Also endgültige Antwort: Im einfachen Fall – der Pfad, den Sie als Parameter übergeben wollen, 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 eine Batch-Datei verwenden. In einem komplexeren Fall – müssen Sie die richtige Frage stellen oder recherchieren, wie Daemons funktionieren und wie man Sperren/Semaphoren und dergleichen für die Interprozesskommunikation (IPC) verwendet.

Viel Glück.

-1
-1
-1
2019-06-27 16:39:40 +0000

Microsoft hat dazu ein Bulletin https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

Grundsätzlich heißt es, die Sequenz “\” vor und nach dem Namen der Batch-Datei zu verwenden.