如果我在参数
中放置空格,我在运行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都可以解决:)
有什么想法吗?
答案 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;
/**
* 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"