Как передать аргумент запланированной задаче Windows с пробелами в ней

108985
Rodney

Мне нужно настроить запланированное задание 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, и оба не удалось. Кажется, нет никаких дискуссий по этому поводу?

13
Вы помещаете аргумент в раздел ** Program / script ** или в раздел ** Add arguments (необязательно) ** при редактировании запланированного задания? William Jackson 12 лет назад 1
Было бы полезно, если бы вы указали, какую именно программу вы используете, так как правильная упаковка аргументов осуществляется по усмотрению программы, а не по расписанию. WinSCP, например, ожидает двойные кавычки ("" ... ""), когда вы должны вкладывать кавычки. Tobias Plutat 12 лет назад 0
Довольно неясно, что: 1) что не выполняется, задача или ваш .exe, и 2) что именно вы ввели и где в пользовательском интерфейсе TaskSched. Может ли быть так, что когда TaskSched запрашивает команду (полный путь к исполняемому файлу), вы пытаетесь задать ей командную строку (совсем другое)? kreemoweet 12 лет назад 0
Почему против пакетного файла? Это делает все так просто! Или вы можете стрелять по сценарию PowerShell, если вы чувствуете себя предприимчивым .. tumchaaditya 10 лет назад 0

7 ответов на вопрос

5
Doltknuckle

I've worked with scheduled tasks and you generally put the arguments in its own text input box. This means that you point the action to the program/script field points to the exe and the "Add Arguments" field should have all of the parameters. (source)

Blog image

I believe this behavior was added to prevent spaces in the file path to the exe causing problems.

I do this all of the time with PowerShell scripts. Here is an example:

  • Program/script: powershell.exe
  • Add arguments: -command "& 'C:\HSD - Copy\logoffstudents.ps1' " -NonInteractive
  • Start in: Blank
Спасибо, но проблема в том, что один из моих параметров - это путь к файлу (и в нем есть пробел). Так что в вашем примере 100 будет работать, но что если вы захотите передать «C: \ Start Folder»? Rodney 12 лет назад 0
Я просто использую кавычки в моих программах, и это работает. Амперсанд требуется только с PowerShell. Этот символ является оператором CALL и позволяет мне вызвать команду powershell. В большинстве случаев, цитаты это все, что вам нужно. На этом этапе вы можете обратиться к создателю exe, чтобы узнать, поддерживают ли они запланированные задачи. Я столкнулся с несколькими редкими программами, которые просто отказываются запускаться как запланированное задание. Я думаю, что есть тонкие различия в том, как параметры передаются, что может вызвать проблемы. Извините, я не могу помочь больше. Doltknuckle 12 лет назад 0
В худшем случае вы можете реструктурировать папку, чтобы исключить пробелы. Это не то, что вы хотите, но это может быть единственным способом заставить это работать. Doltknuckle 12 лет назад 0
Спасибо Doltknuckle - я знаю, что я мог бы также сделать это с файлом .bat (и использовать "" вокруг параметра (как вы делаете в скрипте Powershell. Я уверен, что это ошибка в интерфейсе редактора задач Windows ... (Я я создатель .exe;) - Он отлично работает через тестовый жгут и из командной строки, но не через пользовательский интерфейс Windows ... Rodney 12 лет назад 0
Если вы сделали exe, это может быть вопросом для stackoverflow. У меня есть ощущение, что вам может понадобиться изменить обработку параметров, когда этот exe-файл используется с запланированной задачей. Одно из предложений заключается в том, чтобы ваш exe-файл записывал параметры, полученные в файл, чтобы вы могли видеть, что передается. По крайней мере, это позволит вам увидеть, совпадают ли параметры запланированной задачи с параметрами командной строки. Doltknuckle 12 лет назад 1
Мне удалось найти решение, прочитав этот ответ, но ответ Аман Мехры более ясен в отношении решения. Использование одинарных кавычек внутри двойных кавычек является решением вопроса, и причина, по которой он работает, заключается в том, что Windows удаляет двойные кавычки из out при разборе аргументов, но оставляет внутренние одинарные кавычки нетронутыми для исполняемого файла. carlin.scott 7 лет назад 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" 

Обратите внимание на использование 'в пути к файлу для запуска.

2
Keith

В этом случае вы можете обойти проблему, передав параметр path в формате 8.3.

Вы можете найти формат 8.3 для вашего пути, открыв командную строку и введя команду dir /xв корне вашего диска.

Вы должны увидеть запись, похожую на

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

для вашей директории Program Files.

Затем измените каталог на Program Files с помощью cd "Program Files«cd xyz» и dir /xснова выполните команду, чтобы найти имя формата 8.3 для «The Interface», и так далее.

Ваш окончательный путь к приведенному вами примеру будет выглядеть примерно так:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1 
Спасибо, я ценю ответ, однако это вызывает дальнейшие проблемы. По сути, я вызываю приложение EXE .NET, которое я написал, для чего-то используется этот путь к папке параметров - ему не нравится формат 8.3 и он не может найти путь. Так есть ли другой способ сделать это? Rodney 13 лет назад 0
PS - Так это ошибка в приложении Windows Scheduled Task? Пространства очень распространены! Rodney 13 лет назад 0
Быстрый тест на Windows 7 работает для меня. Можете ли вы провести нас через шаги, которые вы предприняли для постановки задачи, а также различные способы. Спасибо за редактирование там Гарет, выглядит намного приятнее. Keith 13 лет назад 0
Таким образом, задача выполняется нормально с этим форматированием, но тогда моя программа .NET (которая принимает путь в виде строки arg) не распаковывает путь из формата 8.3. Так что, возможно, это вопрос программирования - как обрабатывать 8.3 пути? Rodney 13 лет назад 0
Я знаю, что мы старые, но вы пробовали дефис (-)? Chibueze Opata 11 лет назад 0
1
tomatoma

I had a similar problem with VLC, which I was using on Windows XP. The trick is to enclose the argument of the cmd command in double quotes.

Here is an example of what I used (scheduling a recording at 15:00):

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

Note the use of double quotes just after /c and at the end of the command (after .mpg). The argument with spaces in this case is "C:\Documents and Settings\..."

1
C. M.

Это может помочь понять проблему с другой точки зрения. Допустим, вы программист, которому поручено добавить планировщик задач в 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).

Удачи.

1
SpaceGhost440

Один из способов сделать это - использовать powershell из командной строки.

Добавьте этот код в файл с именем 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-*" 

Затем из командной строки ИЛИ файл ps1 вы можете запустить:

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) 

Каждый соответствующий элемент в массиве taskparameters будет передан как $ (Arg0), $ (Arg1) и $ (Arg2).

0
incognito

Set your scheduled task as follows

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