Мне нужно настроить запланированное задание Windows. Он принимает 1 параметр / аргумент, который является путем и может содержать пробелы. Моя запланированная задача не работает - она «разбивает» параметр на первый пробел.
Если я запускаю его в командной строке, я могу просто обернуть аргумент в "", и он работает нормально, однако, это не работает в пользовательском интерфейсе запланированных задач.
например C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"
Я попытался обернуть аргумент с помощью "" '' [] () и попытался заполнить пробелы% 20, ~ 1 и т. Д. Безуспешно.
Мне известно об одном решении сделать файл bat и использовать «» в моем аргументе, но я не хочу добавлять больше сложности.
Я попробовал это на Windows 7 и Windows 2008 Server, и оба потерпели неудачу. Кажется, нет никаких дискуссий по этому поводу?
Ответы:
Я работал с запланированными задачами, и вы обычно помещали аргументы в собственное поле ввода текста. Это означает, что вы указываете действие на поле программы / скрипта, указывает на исполняемый файл, а поле «Добавить аргументы» должно иметь все параметры. ( источник )
Я считаю, что это поведение было добавлено, чтобы предотвратить пробелы в пути к файлу exe, вызывая проблемы.
Я делаю это все время с помощью скриптов PowerShell. Вот пример:
источник
Обратите внимание на использование
'
в пути файла для запуска.источник
В этом случае вы можете обойти проблему, передав параметр path в формате 8.3.
Вы можете найти формат 8.3 для вашего пути, открыв командную строку и введя команду
dir /x
в корне вашего диска.Вы должны увидеть запись, похожую на
для вашей директории Program Files.
Затем измените каталог на Program Files с помощью
cd "Program Files
«cd xyz» иdir /x
снова выполните команду, чтобы найти имя формата 8.3 для «The Interface», и так далее.Ваш окончательный путь к приведенному вами примеру будет выглядеть примерно так:
источник
У меня была похожая проблема с VLC, которую я использовал в Windows XP. Хитрость заключается в том, чтобы заключить аргумент в
cmd
команде в двойных кавычках.Вот пример того, что я использовал (планирование записи на 15:00):
Обратите внимание на использование двойных кавычек сразу после
/c
и в конце команды (после.mpg
). Аргумент с пробелами в этом случае"C:\Documents and Settings\..."
источник
Один из способов сделать это - использовать powershell из командной строки.
Добавьте этот код в файл с именем MyModule.psm1.
Затем из командной строки ИЛИ файл ps1 вы можете запустить:
Каждый соответствующий элемент в массиве taskparameters будет передан как $ (Arg0), $ (Arg1) и $ (Arg2).
источник
Установите запланированное задание следующим образом
cmd / c C: \ Program Files \ xyz \ FTP File Transfer \ FTPFileTransferTask.exe "C: \ Program Files \ xyz \ Интерфейс \ Путь к папке"
источник
Это может помочь понять проблему с другой точки зрения. Допустим, вы - программист, которому поручено добавить планировщик задач в Windows. Как бы вы это сделали? У вас есть несколько проблем, с которыми приходится сталкиваться: если задача запускается от имени другого пользователя, а не вошедшего в систему пользователя, следует ли раздражать вошедшего в систему пользователя всплывающими сообщениями об ошибках? Что делать, если во время выполнения задачи пользователь не вошел в систему? Как насчет разницы между программой с графическим интерфейсом и консольной программой? Графические интерфейсы не имеют stdin, stdout и stderr; понятие бессмысленно в них. Как насчет программ, внутренних или внешних для COMMAND.COM/CMD.EXE? Или другие скриптовые движки? Как насчет путей с пробелами в имени команды? Или в параметрах (опциях / аргументах)? (Как вы пытаетесь справиться сейчас ..)
Хотя в этом случае я не на 100% уверен насчет внутренних или технических деталей, ответы кажутся следующими: задачи выполняются в изолированном неинтерактивном сеансе, который не может взаимодействовать с вошедшим в систему пользователем (если таковой имеется). ); Он запускается, ожидая, что не будет никакого вывода на консоль, поскольку он неинтерактивный, он не может просто прервать работу любого вошедшего в систему пользователя, чтобы показать вывод (во всяком случае, если вывод есть, stdin - это bitbucket / NULL, stdout и stderr будут зарегистрированы в средство регистрации системы); Пробелы обрабатываются в обход проблемы: имя команды принимается ТОЧНО как есть, а параметры, передаваемые команде, указываются в другом поле ввода в свойствах Задачи.
Все это означает, что ваша задача должна выполняться, как если бы она была похожа на демона (в мире Un * x). Все статично и точно. Имя команды - это фактическое имя команды без каких-либо параметров. Это часто включает в себя запуск интерпретаторов команд / скриптов, таких как CMD.EXE! Параметры, если таковые имеются, указываются в другом месте и должны быть известны при настройке задачи (то есть вы не можете изменять параметры «на лету»). И так далее.
Итак, если вы хотите включить параметры, вы должны использовать раздел параметров, чтобы указать параметры. Планировщик заданий непопробуйте разобрать имя команды, чтобы разделить его на «команду» и «аргументы», как это делают программы командной строки. Он просто воспринимает это как одно большое полное имя команды. Аналогично, если вам нужны переменные параметры, такие как использование% 1 ..% n в файлах BATCH, вы не можете сделать это из самого планировщика задач; Вам придется найти другой путь. (Обратите внимание, что вы также не можете использовать переменные среды, поскольку среда, передаваемая в программу, зависит от среды, с которой запускается задача, а не от «текущей» среды.) Вы можете использовать временный файл для сохранения параметров, но так как вы Необходимо указать статическое имя файла в свойствах Задачи. Что происходит, когда вы находитесь в сети с 5000 пользователями, и четверо из них пытаются запустить одну и ту же задачу одновременно? Они будут разламывать друг друга, пытаясь записать в один и тот же временный файл одновременно, вероятно, не то, что вы хотели, либо. (Есть и решения этой проблемы, но это выходит за рамки этого вопроса и ответа ..)
Итак, окончательный ответ: в простом случае - путь, который вы хотите передать в качестве параметра, является статическим и не изменяется - вы должны либо указать параметры в соответствующем свойстве Task (Аргументы), а не в поле Program / Script или используйте командный файл. В более сложном случае - вам нужно задать правильный вопрос или исследовать, как работают демоны и как использовать блокировку / семафоры и тому подобное для межпроцессного взаимодействия (IPC).
Удачи.
источник
У Microsoft есть бюллетень по этому вопросу: https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create -Он-а
В основном говорится, что нужно использовать последовательность «\» до и после имени командного файла.
источник