JSFL: FLfile.runCommandLine и правильно экранированные пробелы для аргументов командной строки Windows - PullRequest
3 голосов
/ 02 февраля 2012

Я работаю над сценарием JSFL, который будет экспортировать файлы WAV и использовать lame.exe для кодирования их в формате MP3 через FLfile.runCommandLine. Я не могу понять, как правильно экранировать пробелы в командной строке, чтобы это работало.

var command_line = '"C:\pathWithSpaces in pathname\lame.exe" -option1 -option2 "C:\different pathWithSpaces\targetfile.wav" "C:\different pathWithSpaces\targetfile.mp3"' ;
FLfile.runCommandLine (command_line);

результат в командном окне:

«C: \ pathWithSpaces» не считается внутренним или внешним команда, работающая программа или командный файл.

Я пытался заменить пробелы на "% 20" и на "carrat-space" ^ ", оба не удаются. Проверяется, что var command_line работает, когда вырезается и вставляется вручную в командное окно, пробелы кажутся проблемой только при запуске формы в сценарии JSFL.

(простое удаление пробелов из любых путей в среде не вариант. Command_line var генерируется динамически, и должен иметь возможность справляться с пробелами, чтобы быть полезным для других.)

Ответы [ 5 ]

0 голосов
/ 19 апреля 2018

Я думаю, что нашел ваш ответ. Вам нужна дополнительная окружающая цитата.

var filePath = '"c:/somepath"'
var argument = '"argument"'
FLfile.runCommandLine('"'+ filePath + ' ' + argument +'"');

Таким образом, вы в конечном итоге получаете что-то похожее на

""c:/somepath" "argument""

обратите внимание на дополнительные окружающие кавычки

0 голосов
/ 01 августа 2015

Вам вообще не нужно запускать файл .bat.Ваша проблема в том, что вы не конвертируете путь к вашему исполняемому URI в путь платформы до вызова runCommandLine.Ваш код должен выглядеть так:

var exe_path = FLfile.uriToPlatformPath("C:\pathWithSpaces in pathname\lame.exe");

var command_line ='"' + exe_path + '" -option1 -option2 "C:\different pathWithSpaces\targetfile.wav" "C:\different pathWithSpaces\targetfile.mp3"';

FLfile.runCommandLine (command_line);
0 голосов
/ 03 февраля 2012

Знаешь, я могу ошибаться по этому поводу! Я перепробовал кучу вариантов, но не повезло. Я думаю, что это может иметь какое-то отношение к нескольким аргументам ... не уверен без дальнейшего расследования.

Простой обходной путь - сохранить команду в командный файл и запустить:

var command = '"C:/pathWithSpaces in pathname/lame.exe" -option1 -option2 "C:/different pathWithSpaces/targetfile.wav" "C:/different pathWithSpaces/targetfile.mp3"';
FLfile.write('file:///C|/temp/lame.bat', command);
FLfile.runCommandLine('"c:/temp/lame.bat"');

Надеюсь, это поможет:)

0 голосов
/ 03 февраля 2012

Следуя указаниям Дэйва, я получил следующий код:

//get users temp folder& convert to URI
var win_tempLamePath =FLfile.getSystemTempFolder()+'lame.bat';
var win_tempLameURI =FLfile.platformPathToURI(win_tempLamePath);
//generate proper syntax for windows CMD
var win_fileURI = (FLfile.uriToPlatformPath(<URI for target WAV file>);
var win_command =('"'+win_uri+'lame.exe" -V0 -h "' + win_fileURI + '.' + wav +'" "' + win_fileURI + '.mp3" 2> "'+ win_fileURI+'.txt'+'"');
//write the command to lame.bat(aka win_tempLameURI)  & execute
FLfile.write(win_tempLameURI, win_command);
FLfile.runCommandLine(win_tempLamePath);

Блок примечаний в конце win_command

 2> "'+ win_fileURI+'.txt'+'"

Требуется вывод LAME.EXE в текстовый файл,Обычно ">" делает это в Windows cmd, но LAME.EXE использует нечетный метод вывода, который требует "2>" для того же эффекта, как я узнал в этой теме

0 голосов
/ 02 февраля 2012

Это, вероятно, не проблема. Вам необходимо избежать обратной косой черты: C: \\ pathWithSpaces в pathname \\ lame.exe "

Альтернативой является использование косой черты, которую окна также понимают.

...