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


15

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


1
Вы помещаете аргумент в раздел « Программа / сценарий » или « Добавить аргументы (необязательно) » при редактировании запланированной задачи?
Уильям Джексон

Было бы полезно, если бы вы указали, какую именно программу вы используете, так как правильная упаковка аргументов осуществляется по усмотрению программы, а не по расписанию. WinSCP, например, ожидает двойные кавычки ("" ... ""), когда вы должны вкладывать кавычки.
Тобиас Плутат

Довольно неясно, что: 1) что не выполняется, задача или ваш .exe, и 2) что именно вы ввели и где в пользовательском интерфейсе TaskSched. Может ли быть так, что когда TaskSched запрашивает команду (полный путь к исполняемому файлу), вы пытаетесь задать ей командную строку (совсем другое)?
kreemoweet

Почему против пакетного файла? Это делает все так просто! Или вы можете стрелять по сценарию
PowerShell,

Ответы:


6

Я работал с запланированными задачами, и вы обычно помещали аргументы в собственное поле ввода текста. Это означает, что вы указываете действие на поле программы / скрипта, указывает на исполняемый файл, а поле «Добавить аргументы» должно иметь все параметры. ( источник )

Изображение блога

Я считаю, что это поведение было добавлено, чтобы предотвратить пробелы в пути к файлу exe, вызывая проблемы.

Я делаю это все время с помощью скриптов PowerShell. Вот пример:

  • Программа / скрипт: powershell.exe
  • Добавьте аргументы : -команда "& 'C: \ HSD - Copy \ logoffstudents.ps1'" -NonInteractive
  • Начало в: Бланк

Спасибо, но проблема в том, что один из моих параметров - это путь к файлу (и в нем есть пробел). Так что в вашем примере 100 будет работать, но что если вы захотите передать «C: \ Start Folder»?
Родни

Я просто использую кавычки в моих программах, и это работает. Амперсанд требуется только с powershell. Этот символ является оператором CALL и позволяет мне вызвать команду powershell. В большинстве случаев, цитаты это все, что вам нужно. На этом этапе вы можете обратиться к создателю exe-файла, чтобы узнать, поддерживают ли они запланированные задачи. Я столкнулся с несколькими редкими программами, которые просто отказываются запускаться по расписанию. Я думаю, что есть тонкие различия в том, как параметры передаются, что может вызвать проблемы. Извините, я не могу помочь больше.
Doltknuckle

В худшем случае вы можете реструктурировать папку, чтобы исключить пробелы. Это не то, что вы хотите, но это может быть единственным способом заставить это работать.
Doltknuckle

Спасибо Doltknuckle - я знаю, что я мог бы также сделать это с файлом .bat (и использовать "" вокруг параметра (как вы делаете в скрипте Powershell. Я уверен, что это ошибка в интерфейсе редактора задач Windows ... (Я я создатель .exe;) - Он отлично работает через тестовый комплект и из командной строки, но не через пользовательский интерфейс Windows ...
Родни

1
Если вы сделали exe, это может быть вопрос для stackoverflow. У меня есть ощущение, что вам может понадобиться изменить обработку параметров, когда этот exe-файл используется с запланированной задачей. Одно из предложений заключается в том, чтобы ваш exe-файл записывал полученные параметры в файл, чтобы вы могли видеть, что передается. По крайней мере, это позволит вам увидеть, совпадают ли параметры запланированной задачи с параметрами командной строки.
Doltknuckle

6
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"

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


3

В этом случае вы можете обойти проблему, передав параметр 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 и он не может найти путь. Итак, есть ли другой способ сделать это?
Родни

PS - Так это ошибка в приложении Windows Scheduled Task? Пространства очень распространены!
Родни

Быстрый тест на Windows 7 работает для меня. Можете ли вы провести нас через шаги, которые вы предприняли для постановки задачи, а также различные способы. Спасибо за редактирование там Гарет, выглядит намного приятнее.
Кит

Таким образом, задача выполняется нормально с этим форматированием, но тогда моя программа .NET (которая принимает путь в виде строки arg) не распаковывает путь из формата 8.3. Так что, возможно, это вопрос программирования - как обрабатывать пути 8.3?
Родни

Я знаю, что мы старые, но вы пробовали дефис (-)?
Chibueze Opata

1

У меня была похожая проблема с VLC, которую я использовал в Windows XP. Хитрость заключается в том, чтобы заключить аргумент в cmdкоманде в двойных кавычках.

Вот пример того, что я использовал (планирование записи на 15:00):

в 15:00 cmd / c "" C: \ Programmi \ VideoLAN \ VLC \ vlc.exe dvb-t: //quency = 698000000: program = 4006: время выполнения = 5 - выход "C: \ Documents and Settings \ Имя пользователя \ Documents \ Видео \ VLC \ test.mpg ""»

Обратите внимание на использование двойных кавычек сразу после /cи в конце команды (после .mpg). Аргумент с пробелами в этом случае"C:\Documents and Settings\..."


1

Один из способов сделать это - использовать 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

Установите запланированное задание следующим образом

cmd / c C: \ Program Files \ xyz \ FTP File Transfer \ FTPFileTransferTask.exe "C: \ Program Files \ xyz \ Интерфейс \ Путь к папке"


0

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

Удачи.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.