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

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

Мне нужно настроить задачу Windows Scheduled Task. Она принимает 1 параметр/параметр, который представляет собой путь и может содержать пробелы. Моя Запланированная задача не работает - она “разбивает” параметр на первое место.

Если я запущу ее в командной строке, я смогу просто обернуть аргумент в “ ” и она будет работать нормально, однако это не работает в пользовательском интерфейсе запланированной задачи.

, например, C:\Program Files\xyz\FTP File Transfer\FTPFileTransferTask.exe "C:\Program Files\xyz\The Interface\Folder Path"

Я попытался обернуть аргумент в “ ” “ и попытался заполнить пробелы %20, ~1 и т.д. безуспешно.

Я знаю одно решение, как сделать файл летучей мыши и использовать ” “ вокруг моего аргумента, но я не хочу добавлять больше сложности.

Я попробовал его на Windows 7 и Windows 2008 Server, и оба не справились. Кажется, это не обсуждается?

Ответы (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"

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

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

Я работал с запланированными задачами, а вы, как правило, помещаете аргументы в его собственное текстовое поле ввода. Это означает, что вы указываете действие в поле программы/скрипта на exe, а поле “Добавить аргументы” должно иметь все параметры. источник )

Я полагаю, что такое поведение было добавлено, чтобы предотвратить появление пробелов в пути к exe, вызывающих проблемы.

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

  • Программа/скрипт: powershell.exe
  • Добавить аргументы : -команда “& ‘C:\HSD - Copy\logoffstudents.ps1’ ”. -Неинтерактивно
  • Начните с: Пусто.
3
3
3
2011-04-14 06:31:15 +0000

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

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

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

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

для каталога Program Files.

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

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

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

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

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

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

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

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

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

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

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

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

Поставьте задачу по расписанию следующим образом:

cmd /c C:\Program Files\xyz\FTP Файл Transfer\FTPFileTransferTask.exe “C:\Program Files\xyz\The Interface\Folder Путь”.

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

Это может помочь понять проблему с другой точки зрения… Допустим, вы программист, которому поручили добавить планировщик задач в Windows. Как бы вы это сделали? У вас есть несколько проблем: Если задача выполняется кем-то другим, а не входящим в систему пользователем, должны ли Вы раздражать входящего в систему пользователя всплывающими окнами с ошибками? Что делать, если во время выполнения задачи нет пользователя, вошедшего в систему? Что делать с разницей между программой с графическим интерфейсом и консольной программой? В GUI нет stdin, stdout и stderr; концепция в них бессмысленна. А как насчет программ внутренних или внешних по отношению к COMMAND.COM/CMD.EXE? Или других скриптовых движков? А как насчет путей с пробелами в имени команды? Или в параметрах (опциях/аргументах)? (Как вы сейчас пытаетесь разобраться…)

Хотя я не на 100% уверен насчет внутренних или полных технических деталей в этом случае, ответы кажутся… Задачи выполняются в изолированной, неинтерактивной сессии, которая не может взаимодействовать с входящим в систему пользователем (если таковой имеется); Она выполняется в ожидании отсутствия консольного вывода, так как она неинтерактивна, она не может просто прервать любой входящий в систему пользователь, чтобы показать вывод, так или иначе (а если есть вывод, то stdin это bitbucket/NULL, stdout и stderr попадают в систему); Пробелы обрабатываются в обход этой проблемы: имя команды принимается EXACTLY как есть, а параметры передаются команде в другом поле ввода в свойствах задачи.

Все означает, что ваша задача должна выполняться как демон (в мире Un*x). Все статично и точно. Имя команды - это фактическое имя команды, без каких-либо параметров. Это часто включает в себя запущенные интерпретаторы команд/скриптов, такие как CMD.EXE! Параметры, если таковые имеются, указываются в другом месте и должны быть известны при постановке задачи (т.е. вы не можете изменять параметры “на лету”). И так далее.

Итак, если вы хотите включить параметры, вы должны использовать раздел параметров для их указания. Планировщик задач not пытается разобрать имя команды, чтобы разделить его на “command” и “args”, как это делают программы командной строки. Он просто рассматривает это как одно большое, полное имя команды. Аналогично, если вам нужны параметры переменных, например, использование %1 … %n в BATCH-файлах, вы не можете сделать это из самого планировщика задач; вам придется найти другой способ. (Обратите внимание, что вы не можете использовать и переменные окружения, так как окружение, переданное программе, зависит от окружения, с которого запускается задача, а не от “текущего” окружения). Вы можете использовать временный файл для сохранения параметров, но так как в свойствах задачи необходимо указать статическое имя файла, что происходит, когда вы находитесь в сети с 5000 пользователями и четверо из них пытаются запустить одну и ту же задачу одновременно? Они все засоряют друг друга, пытаясь записать в один и тот же временный файл одновременно, скорее всего, это тоже не то, что вы хотели. (Решения этой проблемы тоже есть, но это выходит за рамки этого вопроса и ответа…).

Итак, окончательный ответ: В простом случае – путь, который вы хотите передать в качестве параметра, статичен и не изменяется – вы либо должны указать параметры в соответствующем свойстве Task (Arguments), а не в поле Program/Script, либо использовать пакетный файл. В более сложном случае – вам нужно задать правильный вопрос или исследовать, как работают демоны и как использовать блокировку/семафоры и т.п. для межпроцессного взаимодействия (IPC).

Удачи.

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

У Microsoft есть бюллетень по этому адресу https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

В основном он говорит использовать последовательность “\” до и после имени пакетного файла.

Verwandte Fragen

3
19
10
28
5