Muszę skonfigurować zaplanowane zadanie systemu Windows. Przyjmuje 1 parametr / argument, który jest ścieżką i może zawierać spacje. Moje zaplanowane zadanie nie działa - „rozbija” parametr w pierwszym miejscu.
Jeśli uruchomię go w wierszu polecenia, mogę po prostu zawinąć argument w „” i działa dobrze, jednak nie działa to w interfejsie Zaplanowanego Zadania.
na przykład C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"
Próbowałem zawinąć argument za pomocą „” „” [] () i bez powodzenia próbowałem wypełnić spacje% 20, ~ 1 itd.
Znam jedno rozwiązanie, aby utworzyć plik nietoperza i użyć argumentu „” wokół mojego argumentu, ale nie chcę dodawać większej złożoności.
Wypróbowałem to na Windows 7 i Windows 2008 Server i oba zakończyły się niepowodzeniem. Wydaje się, że nie ma dyskusji na ten temat?
źródło
Odpowiedzi:
Pracowałem z zaplanowanymi zadaniami i zwykle umieszczasz argumenty we własnym polu wprowadzania tekstu. Oznacza to, że skierujesz akcję na pole programu / skryptu, które wskazuje na plik exe, a pole „Dodaj argumenty” powinno mieć wszystkie parametry. ( źródło )
Myślę, że to zachowanie zostało dodane, aby zapobiec spacjom w ścieżce pliku do pliku exe powodującym problemy.
Robię to cały czas za pomocą skryptów PowerShell. Oto przykład:
źródło
Zwróć uwagę na użycie
'
w ścieżce pliku do uruchomienia.źródło
W takim przypadku można obejść problem, przekazując parametr ścieżki w formacie 8.3.
Możesz odkryć format 8.3 swojej ścieżki, otwierając wiersz polecenia i wydając polecenie
dir /x
w katalogu głównym dysku.Powinieneś zobaczyć wpis podobny do
dla katalogu Program Files.
Następnie zmień katalog na Program Files with
cd "Program Files
”, a następnie cd xyz i wydajdir /x
ponownie, aby znaleźć nazwę formatu 8.3 dla„ The Interface ”i tak dalej.Ostateczna ścieżka do podanego przykładu wyglądałaby mniej więcej tak:
źródło
Miałem podobny problem z VLC, którego używałem w systemie Windows XP. Sztuką jest, aby ująć argument w
cmd
komendzie w cudzysłowach.Oto przykład tego, czego użyłem (planując nagranie o 15:00):
Zwróć uwagę na użycie podwójnych cudzysłowów tuż po
/c
i na końcu polecenia (po.mpg
). Argument spacji w tym przypadku to"C:\Documents and Settings\..."
źródło
Jednym ze sposobów na osiągnięcie tego jest użycie PowerShell z wiersza poleceń.
Dodaj ten kod do pliku o nazwie MyModule.psm1.
Następnie z wiersza polecenia LUB pliku ps1 możesz uruchomić:
Każdy odpowiedni element w tablicy parametrów zadania byłby przekazywany jako $ (Arg0), $ (Arg1) i $ (Arg2).
źródło
Ustaw zaplanowane zadanie w następujący sposób
cmd / c C: \ Program Files \ xyz \ FTP File Transfer \ FTPFileTransferTask.exe „C: \ Program Files \ xyz \ Interfejs \ Ścieżka folderu”
źródło
Pomoże to zrozumieć problem z innej perspektywy. Powiedzmy, że jesteś programistą, którego zadaniem jest dodanie 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 osoba inna niż zalogowany użytkownik, czy powinieneś denerwować zalogowanego użytkownika jakimś wyskakującym okienkiem błędu? Co jeśli nie ma zalogowanego użytkownika w momencie uruchamiania zadania? Co z różnicą między programem GUI a programem konsoli? GUI nie mają stdin, stdout i stderr; koncepcja jest w nich bez znaczenia. Co z programami wewnętrznymi lub zewnętrznymi do COMMAND.COM/CMD.EXE? Lub inne silniki skryptowe? Co ze ścieżkami ze spacjami w nazwie polecenia? Lub w parametrach (opcje / argumenty)? (Gdy próbujesz sobie teraz poradzić ...)
Chociaż w tym przypadku nie jestem w 100% pewien co do wewnętrznych elementów ani pełnych szczegółów technicznych, odpowiedzi wydają się być… Zadania są uruchamiane w odizolowanej, nieinteraktywnej sesji, która nie może wchodzić w interakcje z aktualnie zalogowanym użytkownikiem (jeśli w ogóle ); Uruchamia się, oczekując, że nie będzie żadnego wyjścia konsoli, ponieważ jest nieinteraktywny, nie może po prostu przerwać zalogowanego użytkownika, aby pokazać wyjście, w każdym razie (a jeśli jest wyjście, stdin jest bitbucket / NULL, stdout i stderr zostają zalogowane do funkcja logowania do systemu); Spacje są obsługiwane przez pominięcie problemu: nazwa polecenia jest pobierana DOKŁADNIE w takiej postaci, w jakiej jest, a parametry przekazywane do polecenia są określone w innym polu wejściowym we właściwościach zadania.
Oznacza to, że twoje zadanie musi być uruchomione tak, jakby było demonem (w świecie Un * x). Wszystko jest statyczne i precyzyjne. Nazwa polecenia jest faktyczną nazwą polecenia, bez żadnych parametrów. Często obejmuje to uruchamianie interpreterów poleceń / skryptów, takich jak CMD.EXE! Parametry, jeśli istnieją, są określone gdzie indziej i muszą być znane podczas konfigurowania zadania (tzn. Nie można zmieniać parametrów „w locie”). I tak dalej.
Tak więc, jeśli chcesz dołączyć parametry, musisz użyć sekcji parametrów, aby określić parametry. Harmonogram zadań niespróbuj parsować nazwę polecenia, aby podzielić go na „polecenie” i „argumenty”, tak jak robią to programy wiersza poleceń. Po prostu traktuje to jako jedną wielką, pełną nazwę polecenia. Podobnie, jeśli chcesz parametrów zmiennych, takich jak użycie% 1 ..% n w plikach BATCH, nie możesz tego zrobić z poziomu samego Harmonogramu zadań; Musisz znaleźć inny sposób. (Należy pamiętać, że nie można również używać zmiennych środowiskowych, ponieważ środowisko przekazane do programu zależy od środowiska, w którym uruchamiane jest zadanie, a NIE od środowiska „bieżącego”.) Można użyć pliku tymczasowego do zapisania parametrów, ale ponieważ musisz określić statyczną nazwę pliku we właściwościach zadania, co dzieje się, gdy jesteś w sieci z 5000 użytkownikami i czterech z nich próbuje uruchomić to samo zadanie w tym samym czasie? Wszyscy będą się wzajemnie zaciskać, próbując jednocześnie zapisać w tym samym pliku tymczasowym, prawdopodobnie też nie to, czego chciałeś. (Istnieją również rozwiązania tego problemu, ale wykracza to zbyt daleko poza zakres tego pytania i odpowiedzi ..)
Ostateczna odpowiedź: w prostym przypadku - ścieżka, którą chcesz przekazać jako parametr, jest statyczna i nie zmienia się - albo musisz podać parametry w odpowiedniej właściwości Zadania (Argumenty), a nie w polu Program / Skrypt lub użyj pliku wsadowego. W bardziej złożonym przypadku - musisz zadać właściwe pytanie lub zbadać, w jaki sposób działają demony i jak używać blokowania / semaforów i tym podobnych do komunikacji międzyprocesowej (IPC).
Powodzenia.
źródło
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 się o użyciu sekwencji „\” przed i po nazwie pliku wsadowego.
źródło