【问题标题】:Adobe AIR NativeProcess fails with spaces in arguments?Adobe AIR NativeProcess 因参数中的空格而失败?
【发布时间】:2011-06-03 14:39:03
【问题描述】:

如果我在参数中添加空格,我会在运行 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 也没有答案,而且众所周知,他可以解决每个 Adob​​e 错误:)

有什么想法吗?

【问题讨论】:

  • 您使用的是哪个版本。我正在使用最新版本,并且参数中的空格没有任何问题。你在使用 var args =new air.Vector[""]();初始化参数
  • 是的,Pradeep,我使用的是 Vector 但不是 air.Vector,我在 air 包中没有任何 Vector。我相信 Vector 在顶级包中。另外,我使用的是最新的 FB 4.5。
  • 我问的是Adobe AIR版本,我的是2.6

标签: air


【解决方案1】:

我正在像这样在 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);

【讨论】:

  • 没有air.Vector。 Vector 在顶级包中,否则我的代码几乎和你的一样,除了我调用 cmd.exe 然后将 bat 作为参数传递,其他参数在这之后。我还发布了该应用程序,但警告不要在 Windows 的路径中使用空格。再次感谢。
【解决方案2】:

对此进行扩展:它起作用的原因(见上面的帖子):

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

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

nativeProcessStartupInfo.arguments = args;

air 期望传递给 nativeProcess 的参数由空格分隔。如果你传递“C:\folder with spaces\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】:

    更新 - 解决方案

    File 对象通过 nativePath 或 resolvePath 生成的字符串使用“\”作为路径。将“\”替换为“/”即可。


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

    我花了一天的大部分时间试图让它工作,但它不会工作。无论“参数”中的空格发生什么,都会完全破坏路径。

    命令行中的示例 7za.exe:

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

    这很好用。现在尝试使用 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\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 文件夹结构。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
         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。 (文件名中的空格问题)

        【讨论】:

          【解决方案6】:

          这在 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;
          

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-08
              • 1970-01-01
              • 2019-03-11
              • 1970-01-01
              • 2018-10-18
              相关资源
              最近更新 更多