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

Jak przekazać argument do zadania zaplanowanego w systemie Windows zawierający spacje?

Muszę skonfigurować Zaplanowane zadanie systemu Windows. Akceptuje on 1 parametr/argument, który jest ścieżką i może zawierać spacje. Moje zaplanowane zadanie nie działa - “rozbija” parametr na pierwszej spacji.

Jeśli uruchomię go w Wierszu poleceń, mogę po prostu zawinąć argument w “ ” i działa dobrze, jednak nie działa to w interfejsie użytkownika zaplanowanego zadania.

np. C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

Próbowałem zawinąć argument z “ ” ‘ ’ i próbowałem wypełnić spacje za pomocą %20, ~1 itp. bez powodzenia.

Wiem o jednym rozwiązaniu, aby zrobić plik bat i użyć “ ” wokół mojego argumentu, ale nie chcę dodawać więcej złożoności.

Próbowałem go na Windows 7 i Windows 2008 Server i oba zawiodły. Wydaje się, że nie ma żadnych dyskusji na ten temat?

Odpowiedzi (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"

Zwróć uwagę na użycie ' w ścieżce do pliku, który ma zostać uruchomiony.

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

Pracowałem z zaplanowanymi zadaniami i generalnie umieszczasz argumenty w swoim własnym polu wprowadzania tekstu. Oznacza to, że wskazujesz akcję na program / pole skryptu wskazuje na exe, a pole “Dodaj argumenty” powinno mieć wszystkie parametry. źródło ](http://technet.microsoft.com/en-us/library/cc770904.aspx))

Wierzę, że to zachowanie zostało dodane, aby zapobiec spacjom w ścieżce do pliku exe powodującym problemy.

Robię to cały czas ze skryptami PowerShell. Oto przykład:

  • Program/skrypt: powershell.exe
  • Dodaj argumenty : -command “& ‘C:HSD - Copy -logoffstudents.ps1’ ” -NonInteractive
  • Start in: Blank
3
3
3
2011-04-14 06:31:15 +0000

W tym przypadku, możesz obejść problem przekazując parametr ścieżki w formacie 8.3.

Możesz odkryć format 8.3 dla swojej ścieżki, otwierając wiersz poleceń i wydając polecenie dir /x w katalogu głównym dysku.

Powinieneś zobaczyć wpis podobny do

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

dla katalogu Program Files.

Następnie zmień katalog na Program Files za pomocą cd "Program Files“, po czym cd xyz i ponownie dir /x, aby znaleźć nazwę formatu 8.3 dla "The Interface”, i tak dalej.

Twoja ostateczna ścieżka dla podanego przez Ciebie przykładu wyglądałaby mniej więcej tak:

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

Miałem podobny problem z VLC, którego używałem na Windows XP. Sztuczka polega na ujęciu argumentu polecenia cmd w cudzysłów.

Oto przykład tego, czego użyłem (planując nagranie na godzinę 15:00):

o 15:00 cmd /c “"C:\Programmi\VideoLAN\VLC\vlc.exe dvb-t://frequency=6980000 :program=4006 :run-time=5 –sout "C:\Documents and Settings\UserName\Documents\Video\VLC\test.mpg”“.

Zwróć uwagę na użycie cudzysłowów tuż po /c oraz na końcu polecenia (po .mpg). Argument z odstępami w tym przypadku to "C:\Documents and Settings\..."

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

Jednym ze sposobów, aby to osiągnąć jest użycie powershell z linii poleceń.

Dodaj ten kod do pliku o nazwie 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-*"

Następnie z wiersza poleceń lub pliku ps1 możesz uruchomić:

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)

Każda odpowiednia pozycja w tablicy taskparameters zostałaby przekazana jako $(Arg0), $(Arg1), i $(Arg2).

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

Ustaw zaplanowane zadanie w następujący sposób

cmd /c C:™Program Files™FTP File Transfer™FTPFileTransferTask.exe “C:™Program Files™Interface™Folder Path”.

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

Może pomóc zrozumieć problem z innej perspektywy… Powiedzmy, że jesteś programistą, któremu powierzono zadanie dodania harmonogramu zadań do systemu Windows. Jak byś to zrobił? Masz kilka problemów, z którymi musisz się zmierzyć: Jeśli zadanie jest uruchamiane jako ktoś inny niż zalogowany użytkownik, czy powinieneś denerwować zalogowanego użytkownika wyskakującymi okienkami błędów? Co zrobić, jeśli nie ma zalogowanego użytkownika w czasie, gdy zadanie jest uruchamiane? Jaka jest różnica między programem GUI a programem konsolowym? Programy GUI nie mają stdin, stdout i stderr; pojęcie to jest w nich bez znaczenia. A co z programami wewnętrznymi lub zewnętrznymi w stosunku do COMMAND.COM/CMD.EXE? Albo innymi silnikami skryptowymi? Co ze ścieżkami ze spacjami w nazwie polecenia? Lub w parametrach (opcjach/argumentach)? (Tak jak teraz próbujesz sobie z tym poradzić…)

Chociaż nie jestem w 100% pewny co do wewnętrznych lub pełnych szczegółów technicznych w tym przypadku, odpowiedzi wydają się być… Zadania są uruchamiane w odizolowanej, nieinteraktywnej sesji, która nie może wchodzić w interakcję z aktualnie zalogowanym użytkownikiem (jeśli w ogóle); Jest uruchamiany, oczekując, że nie będzie wyjścia konsoli, ponieważ jest nieinteraktywny, nie może po prostu przerwać zalogowanego użytkownika, aby pokazać wyjście, tak czy inaczej (a jeśli jest wyjście, stdin jest bitbucket/NULL, stdout i stderr są logowane do systemowego obiektu logowania); Przestrzenie są obsługiwane przez obejście problemu: nazwa polecenia jest brana EXACTLY as is, a parametry są przekazywane do polecenia są określone w innym polu wejściowym we właściwościach Task.

To wszystko oznacza, że Twoje zadanie musi być uruchamiane tak, jakby było demonem (w świecie Unlimited). Wszystko jest statyczne i precyzyjne. Nazwa polecenia jest faktyczną nazwą polecenia, bez żadnych parametrów. To często obejmuje uruchamianie interpreterów poleceń/skryptów, takich jak CMD.EXE! Parametry, jeśli istnieją, są określone gdzie indziej i muszą być znane w momencie tworzenia zadania (to znaczy, nie można zmieniać parametrów “w locie”). I tak dalej.

Tak więc, jeśli chcesz dołączyć parametry, musisz użyć sekcji parametry, aby je określić. Harmonogram zadań nie próbuje przetworzyć nazwy polecenia, aby podzielić je na “polecenie” i “argumenty”, tak jak robią to programy wiersza poleceń. Po prostu traktuje je jako jedną dużą, pełną nazwę polecenia. Podobnie, jeśli chcesz mieć zmienne parametry, takie jak użycie %1 … %n w plikach BATCH, nie możesz tego zrobić z poziomu samego Harmonogramu zadań; będziesz musiał znaleźć inny sposób. (Zauważ, że nie możesz również używać zmiennych środowiskowych, ponieważ środowisko przekazywane do programu zależy od środowiska, z którym zadanie jest uruchamiane, a nie od “bieżącego” środowiska). Możesz użyć pliku tymczasowego do zapisania parametrów, ale ponieważ musisz podać statyczną nazwę pliku we właściwościach zadania, co się stanie, gdy jesteś w sieci z 5000 użytkowników i czterech z nich spróbuje uruchomić to samo zadanie w tym samym czasie? Wszyscy oni będą się nawzajem obijać próbując pisać do tego samego pliku tymczasowego w tym samym czasie, prawdopodobnie nie jest to to, czego chciałeś. (Istnieją rozwiązania tego problemu, ale to wykracza zbyt daleko poza zakres tego pytania i odpowiedzi…)

Więc ostateczna odpowiedź: W prostym przypadku – ścieżka, którą chcesz przekazać jako parametr jest statyczna i nie zmienia się – musisz albo określić parametry w odpowiedniej właściwości Task (Arguments), a nie w polu Program/Script, albo użyć pliku wsadowego. W bardziej skomplikowanych przypadkach – będziesz musiał zadać odpowiednie pytanie lub dowiedzieć się jak działają demony i jak używać blokad/semaforów i tym podobnych do komunikacji międzyprocesowej (IPC).

Powodzenia.

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

Microsoft ma biuletyn na ten temat https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

Zasadniczo mówi on, aby użyć sekwencji *“\” * przed i po nazwie pliku wsadowego.