Adobe AIR NativeProcess失败,参数中有空格?

时间:2011-06-03 14:39:04

标签: air

如果我在参数

中放置空格,我在运行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(“blah”)一切正常

如果我使用

args.push(“blah blah”)程序中断,就像找不到文件一样。

好像我不是唯一一个:

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

作为他们指出的用户之一,它看起来似乎是21世纪最前沿的SDK的可怕限制。甚至Alex Harui也没有答案,他知道每个Adobe bug都可以解决:)

有什么想法吗?

7 个答案:

答案 0 :(得分:3)

我在这样的JavaScript中使用AIR 2.6 SDK,即使对于空格也能正常工作。 请用这个检查你的代码。

    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);

答案 1 :(得分:3)

要扩展这个:这是有效的原因(见上文):

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

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

nativeProcessStartupInfo.arguments = args;

是air希望传递给nativeProcess的参数由空格分隔。如果你传递“C:\文件夹与spaces \ myfile.doc”(并且BTW for AIR的文件路径需要为"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]);  
};

答案 2 :(得分:2)

更新 - 解决方案

由NativePath或resolvePath由File对象生成的字符串使用“\”作为路径。将“\”替换为“/”,它可以正常工作。


我在尝试使用NativeProcess调用7za.exe时遇到同样的问题。如果你试图访问各种Windows目录,整个事情就会失败。即使尝试运行command.exe并调用批处理文件也会失败,因为您仍然必须尝试通过NativeProcessStartupInfo对象上的“arguments”传递带空格的路径。

我花了大部分时间试图让它工作,但它不会起作用。无论“论据”中的空格发生什么,都会彻底破坏道路。

命令行示例7za.exe:

7za.exe a MyZip.7z“D:\ docs \ My Games \ Some Game Title \ Maps \ The Map.map”

这很好用。现在尝试使用AIR中的Native Process。 AIR参数清理程序是FUBAR。

我已经尝试了无数种方式来加入参数,但它失败了。有趣的是我可以把它吐出一个zip文件,但拉链中没有内容。我认为这是由于第一个参数设置最终起作用,但后来失败了路径参数。

例如:

processArgs [0] ='a'; processArgs [1] ='D:\ apps \ flash builder 4.5 \ project1 \ bin-debug \ MyZip.7z'; processArgs [2] ='D:\ docs \ My Games \ Some Game Title \ Maps \ The Map.map';

出于某种原因,这会发出一个名为bin-debugMyZip.7z的zip文件,但是zip是空的。

无论AIR做什么,它都会破坏路径字符串。我试过以各种方式在这些路径周围添加引号。什么都行不通。

我以为我可以从此示例中调用批处理文件: http://technodesk.wordpress.com/2010/04/15/air-2-0-native-process-batch-file/

但它也失败了,因为它仍然需要通过参数传递路径。

任何人都有运气7z或在NativeProcess中处理完整路径的运气吗?所有这些小快乐的教程都没有处理真正的Windows文件夹结构。

答案 3 :(得分:1)

适用于我的解决方案 - 将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);
 }

答案 4 :(得分:0)

 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。 (文件名中的空格问题)

答案 5 :(得分:0)

这适用于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;

答案 6 :(得分:0)

如果您的应用程序路径或参数包含空格,请确保将其包装在引号中。例如,应用程序的路径有空格C:\Program Files (x86)\Camera\Camera.exe使用引号,如:

"C:\Program Files (x86)\Camera\Camera.exe"