Сбой Adobe AIR NativeProcess с пробелами в аргументах? - PullRequest
0 голосов
/ 03 июня 2011

У меня проблема с запуском NativeProcess, если я вставил пробелы в аргументы



if (Capabilities.os.toLowerCase().indexOf("win") > -1)
{
  fPath = "C:\\Windows\\System32\\cmd.exe";
  args.push("/c");
  args.push(scriptDir.resolvePath("helloworld.bat").nativePath);                
}

file = new File(fPath);

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = file;                     

args.push("blah");

nativeProcessStartupInfo.arguments = args;
process = new NativeProcess();
process.start(nativeProcessStartupInfo);

в приведенном выше коде, если я использую

args.push ("бла") все работает нормально

, если я использую

args.push ("бла-бла") программа ломается, как будто файл не был найден.

Похоже, я не единственный:

http://tech.groups.yahoo.com/group/flexcoders/message/159521

Как заметил один из пользователей, это действительно похоже наужасное ограничение передовой SDK 21-го века.Даже у Алекса Харуи не было ответа, и он знает, как обойти каждую ошибку Adobe:)

Есть идеи?

Ответы [ 7 ]

3 голосов
/ 21 сентября 2011

Подробнее об этом: причина того, что это работает (см. Пост выше):

var args =new air.Vector["<String>"]();

for(i=0; i<arguments.length; i++)
    args.push(arguments[i]);

nativeProcessStartupInfo.arguments = args;

означает, что air ожидает, что аргументы, передаваемые в nativeProcess, разделяются пробелами. Если вы передадите «C: \ папка с пробелами \ myfile.doc» (и, кстати, для AIR путь к файлу для Windows должен быть "C:\\folder with spaces\\myfile.doc"), вам нужно будет сделать следующее:

args.push("C:\\folder");
args.push("with");
args.push("spaces\\myfile.doc");

Следовательно, что-то вроде этого работает:

var processArgs = new air.Vector["<String>"]();    
var path = "C:\\folder with spaces\\myfile.doc"
var args = path.split(" ")
for (var i=0; i<args.length; i++) {
processArgs.push(args[i]);  
};
3 голосов
/ 08 июня 2011

Я использую AIR 2.6 SDK в JavaScript, как это, и он отлично работает даже для пробелов.пожалуйста, проверьте ваш код с этим.

    var file = air.File.applicationDirectory;
file = file.resolvePath("apps");
if (air.Capabilities.os.toLowerCase().indexOf("win") > -1)
{
    file = file.resolvePath(appFile);
}

var nativeProcessStartupInfo = new air.NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = file;

var args =new air.Vector["<String>"]();

for(i=0; i<arguments.length; i++)
    args.push(arguments[i]);

nativeProcessStartupInfo.arguments = args;

process = new air.NativeProcess();
process.addEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(air.ProgressEvent.STANDARD_INPUT_PROGRESS, inputProgressListener);
process.start(nativeProcessStartupInfo);
2 голосов
/ 10 июля 2011

ОБНОВЛЕНИЕ - РЕШЕНИЕ

Строка, сгенерированная объектом File с помощью nativePath или resolPath, использует "\" для пути. Замените "\" на "/", и это работает.


У меня та же проблема при попытке вызвать 7za.exe с помощью NativeProcess. Если вы пытаетесь получить доступ к различным каталогам Windows, все это терпит неудачу ужасно. Даже попытка запустить command.exe и вызвать командный файл не удалась, потому что вам все равно придется пытаться передать путь с пробелами через «аргументы» в объекте NativeProcessStartupInfo.

Я потратил большую часть дня, пытаясь заставить это работать, и это не будет работать. Все, что происходит с пробелами в «аргументах», полностью разрушает путь.

Пример 7za.exe из командной строки:

7za.exe a MyZip.7z "D: \ docs \ Мои игры \ Заголовок некоторых игр \ Карты \ Карта.map"

Это отлично работает. Теперь попробуйте это с Native Process в AIR. Средство очистки аргументов AIR - FUBAR.

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

Например:

processArgs [0] = 'a'; processArgs [1] = 'D: \ apps \ flash builder 4.5 \ project1 \ bin-debug \ MyZip.7z'; processArgs [2] = 'D: \ docs \ Мои игры \ Заголовок некоторых игр \ Карты \ Карта.map';

По какой-то причине это выплевывает zip-файл с именем bin-debugMyZip.7z, но zip пуст.

Что бы AIR ни делал, он разрушает пути. Я пытался добавлять кавычки вокруг этих путей различными способами. Ничего не работает.

Я подумал, что могу вернуться к вызову командного файла из этого примера: http://technodesk.wordpress.com/2010/04/15/air-2-0-native-process-batch-file/

Но он также не работает, потому что он все еще требует, чтобы путь был передан через аргументы.

Кому-нибудь повезло с вызовом 7z или с полными путями в NativeProcess? Все эти маленькие счастливые уроки не имеют отношения к реальной структуре папок Windows.

1 голос
/ 07 февраля 2013

Решение, которое работает для меня - установите path_with_space как свойство "nativeProcessStartupInfo.workingDirectory". Смотрите пример ниже:

public function openPdf(pathToPdf:String):void
 }
     var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
     var file:File = File.applicationDirectory.resolvePath("C:\\Windows\\System32\\cmd.exe");
     nativeProcessStartupInfo.executable = file;
     if (Capabilities.os.toLowerCase().indexOf("win") > -1)
     {
         nativeProcessStartupInfo.workingDirectory = File.applicationDirectory.resolvePath(pathToPdf).parent;
         var processArgs:Vector.<String> = new Vector.<String>();
         processArgs[0] = "/k";
         processArgs[1] = "start";
         processArgs[2] = "test.pdf";
         nativeProcessStartupInfo.arguments = processArgs;
         process = new NativeProcess();
         process.start(nativeProcessStartupInfo);
         process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
 }
0 голосов
/ 17 декабря 2012

Если путь к вашему приложению или параметр содержит пробелы, обязательно заключите его в кавычки.Например, путь к приложению содержит пробелы C:\Program Files (x86)\Camera\Camera.exe, используйте такие кавычки, как:

"C:\Program Files (x86)\Camera\Camera.exe"
0 голосов
/ 22 ноября 2011

Это работает для меня на Windws7:

var Xargs:Array = String("/C#echo#a trully hacky way to do this :)#>#C:\\Users\\Benjo\\AppData\\Roaming\\com.eblagajna.eBlagajna.POS\\Local Store\\a.a").split("#");
var args:Vector.<String> = new Vector.<String>();
for (var i:int=0; i<Xargs.length; i++) {
    trace("Pushing: "+Xargs[i]);
    args.push(Xargs[i]);  
};
NPI.arguments = args;
0 голосов
/ 12 июня 2011
 args.push( '"blah blah"' );

Командная строка после всех поддерживает пробелы, если они вложены в "".

Так что, если допустим, у вас есть аргумент файла:

'test/folder with space/blah'

Преобразовать в следующее

'test/"folder with space"/blah'

При желании можно использовать фильтр:

Однажды у меня была такая проблема в AIR, я просто фильтровал текст, прежде чем вставить его в массив. Я использую CASA lib, хотя

import org.casalib.util.ArrayUtil;

http://casalib.org/

/**
 * Filters a string input for 'safe handling', and returns it
 **/
public function stringFilter(inString:String, addPermitArr:Array = null, permitedArr:Array = null):String {
    var sourceArr:Array = inString.split('');   //Splits the string input up
    var outArr:Array = new Array();

    if(permitedArr == null) {
        permitedArr = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" as String).split('');
    }
    if( addPermitArr != null ) {
        permitedArr = permitedArr.concat( addPermitArr );
    }

    for(var i:int = 0; i < sourceArr.length; i++) {
        if( ArrayUtil.contains( permitedArr, sourceArr[i] ) != 0 ) { //it is allowed
            outArr.push( sourceArr[i] );
        }
    }

    return (outArr.join('') as String);
}

И просто отфильтруйте его через

args.push( stringFilter( 'blah blah', new Array('.') ) );

Кроме того, это действительно плохая практика - использовать пробелы в именах / аргументах файлов, вместо этого использовать '_'. Это, кажется, происходит из Linux, хотя. (Вопрос о пробелах в именах файлов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...