Як передати аргумент завданню із розкладом 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, якщо ви відчуваєте пригоди ..
tumchaaditya

Відповіді:


6

Я працював із запланованими завданнями, і ви зазвичай розміщуєте аргументи у власному полі введення тексту. Це означає, що ви вказуєте дію на поле програми / скрипта, вказує на exe, а поле "Додати аргументи" повинно мати всі параметри. ( джерело )

Зображення в блозі

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

Я роблю це весь час за допомогою сценаріїв PowerShell. Ось приклад:

  • Програма / сценарій: powershell.exe
  • Додати аргументи : -command "&" C: \ HSD - Copy \ logoffstudents.ps1 '"-NonInteractive
  • Початок: Пустий

Дякую, але проблема полягає в тому, що один з моїх параметрів - це шлях до файлу (і в ньому є пробіл). Так у вашому прикладі 100 буде працювати, але що робити, якщо ви хотіли передати "C: \ Start Folder"?
Родні

Я просто використовую котирування у своїх програмах, і це працює. Амперсанд потрібен лише за допомогою оболонки. Цей символ є оператором CALL і дозволяє мені створити команду shellhell. У більшості випадків цитати - це все, що вам потрібно. У цей момент, можливо, ви захочете звернутися до творця 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

У цьому випадку можна вирішити проблему, передавши параметр шляху у форматі 8.3.

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

Ви повинні побачити запис, схожий на

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

для каталогу програмних файлів.

Потім змініть каталог на програмні файли на cd "Program Files", а потім cd xyz і dir /xзнову видайте, щоб знайти ім'я формату 8.3 для" Інтерфейсу "тощо.

Ваш останній шлях для прикладу, який ви подали, виглядав би приблизно так:

C:\PROGRA~1\XYZ\THEINT~1\FOLDER~1

Дякую, я вдячний за відповідь, проте це спричиняє подальші проблеми. В основному я закликаю EXE .NET додаток, про який я писав, який використовує цей шлях до папок парамів для чогось - він не любить формат 8.3 і не може знайти шлях. Отже, чи є інший спосіб це зробити?
Родні

ps - Отже, це помилка у додатку Заплановані завдання Windows? Простори дуже поширені!
Родні

Швидкий тест на Windows 7 працює для мене. Чи можете ви пройти нас через кроки, які ви зробили для постановки завдання, як це є різні способи. Дякую за редакцію там, Гарет, виглядає набагато приємніше.
Кіт

Таким чином, завдання працює з цим форматуванням нормально, але тоді моя .NET програма (яка приймає шлях як аргумент) не скасовує шлях з формату 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: // частота = 698000000: program = 4006: run-time = 5 --sout "C: \ Документи та налаштування \ UserName \ Documents \ Video \ VLC \ test.mpg "" "

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


1

Один із способів, яким ви могли це досягти, - це використання командної строчки з командного рядка.

Додайте цей код у файл під назвою 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

Поставте своє заплановане завдання наступним чином

cmd / c C: \ програмні файли \ xyz \ FTP передача файлів \ FTPFileTransferTask.exe "C: \ програмні файли \ xyz \ інтерфейс \ шлях папки"


0

Це може допомогти зрозуміти проблему з іншого погляду. Скажімо, ви програміст, якому доручено додати планувальник завдань до Windows. Як би ти це зробив? У вас є кілька проблем, з якими можна зіткнутися: Якщо завдання виконується як хтось інший, ніж зареєстрований користувач, чи слід дратувати зареєстрованого користувача будь-якою помилкою? Що робити, якщо користувач не зареєструвався під час виконання завдання? Як щодо різниці між програмою GUI та консольною програмою? GUI не мають stdin, stdout та stderr; поняття в них безглуздо. Що з внутрішніми або зовнішніми програмами COMMAND.COM/CMD.EXE? Або інші двигуни сценаріїв? А як щодо шляхів із пробілами у назві команди? Або в параметрах (параметри / аргументи)? (Як ви зараз намагаєтеся впоратися.)

Хоча я не на 100% впевнений у внутрішніх або повних технічних деталях у цьому випадку, відповіді, здається, є .. Завдання виконуються в ізольованому, неінтерактивному сеансі, який не може взаємодіяти з користувачем, який наразі увійшов у систему (за наявності ); Він очікує, що консольного виходу не буде, оскільки він не інтерактивний, він не може просто перервати будь-якого зареєстрованого користувача, щоб показати вихід, як би там не було (і якщо є вихід, stdin - це bitbucket / NULL, stdout та stderr, щоб увійти до нього систему реєстрації системи); Проміжки обробляються шляхом обходу питання: ім'я команди приймається ТОЧНО, як є, а параметри передаються команді вказуються в іншому полі вводу у властивостях Завдання.

Все, що означає, що ваше завдання потрібно виконувати так, ніби це було як демон (у світі Un * x). Все статично і точно. Ім'я команди - власне ім'я команди без будь-яких параметрів. Сюди часто входять запущені інтерпретатори команд / скриптів, такі як CMD.EXE! Параметри, якщо такі є, вказані в іншому місці і повинні бути відомі під час налаштування завдання (тобто ви не можете змінити параметри "під час руху"). І так далі.

Отже, якщо ви хочете включити параметри, вам потрібно використовувати розділ параметрів, щоб вказати параметри. Планувальник завдань цього не робитьспробуйте розібрати ім'я команди, щоб розділити її на "команду" та "аргументи", як це роблять програми командного рядка. Це просто трактує це як одне велике, повне ім'я команди. Так само, якщо ви хочете змінювати параметри, наприклад, використовувати% 1 ..% n у файлах BATCH, ви не можете цього зробити з самого планувальника завдань; Вам доведеться знайти інший спосіб. (Зверніть увагу, що ви також не можете використовувати змінні середовища, оскільки середовище, передане програмі, залежить від середовища, з якого починається завдання, а не "поточного" середовища.) Ви можете використовувати тимчасовий файл для збереження параметрів, але оскільки повинні вказати статичне ім'я файлу у властивостях Завдання, що відбувається, коли ви знаходитесь у мережі з 5000 користувачами, і чотири з них намагаються одночасно виконати одне завдання? Усі вони одночасно намагаються записати в той самий тимчасовий файл, напевно, не те, чого хотіли. (Є і рішення цієї проблеми, але це занадто далеко виходить за рамки цього питання та відповіді.)

Отже, остаточна відповідь: У простому випадку - шлях, який ви хочете пройти як параметр, є статичним і не змінюється - вам або потрібно вказати параметри у відповідному властивості Завдання (Аргументи), а не у вікні Program / Script або використовувати пакетний файл. У більш складному випадку - вам потрібно буде задати правильне запитання або дослідити, як працюють демони та як використовувати блокування / семафори та інше для міжпроцесорного спілкування (IPC).

Удачі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.