2011-06-03 11 views
0

私は上記のコードでAdob​​e 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(「何とか」)すべてがうまく

の作品、NativeProcessオブジェクトを実行している問題を抱えています私は

args.push( "何とか何とか")ファイルかのようプログラムブレークを使用する場合

が見つかりませんでした。私は一つだけじゃないよう

は思え:アウト彼らの尖ったユーザーの一人として

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

、それは本当に21世紀の最先端のSDKによってひどい制限のように思えます。アレックス・ハルイ氏にも答えはありませんでした。彼はすべてのAdobeバグを回避することが知られています:)

アイデア?

+0

このバージョンを使用しています。私は最新のバージョンを使用しています。私は議論でスペースに問題はありません。 あなたは使っていますか?\t \t var args = new air.Vector [""](); argsを初期化する – Pradeep

+0

はいPradeep、私はVectorではなくair.Vectorを使用しています.Vector、私は空のパッケージにベクトルを持っていません。私はトップレベルパッケージに入っていると信じています。また、私は最新のFB 4.5を使用しています。 – Ska

+0

Adob​​e AIRバージョンについて質問していますが、私は2.6 – Pradeep

答えて

2

UPDATE - SOLUTION

にnativePathまたはresolvePathいずれかによってFileオブジェクトによって生成された文字列がパスの "\" を使用しています。 "\"を "/"に置き換えてください。


NativeProcessを使用して7za.exeを呼び出すときに同じ問題が発生しています。さまざまなWindowsディレクトリにアクセスしようとすると、すべてがひどく失敗します。 command.exeを実行してバッチファイルを呼び出そうとしても、NativeProcessStartupInfoオブジェクトの "arguments"で空白を含むパスを渡す必要があるため、失敗します。

私はこれをうまく動作させるために一日のうちに良いところを過ごしましたが、うまくいきません。 「議論」のスペースに何が起こったとしても、そのパスは完全に破壊されます。

コマンドラインからの例7za.exe:

7za.exe MyZip.7z "D:マイゲーム\ \ドキュメント\いくつかのゲームタイトル\地図\ザ・Map.map"

これは正常に動作に。今度はAIRのネイティブプロセスでそれを試してみてください。 AIRの引数サニタイザはFUBARです。

私は引数を入れるために無数の方法を試しましたが、失敗に終わりました。興味深いのは、zipファイルを吐き出すが、zipには内容がないということだ。これは、最初の引数が最終的には動作していたが、次にpath引数に失敗したためであると考えています。例えば

processArgs [0] = 'A'; processArgs [1] = 'D:\ apps \ flashビルダー4.5 \ project1 \ bin-debug \ MyZip.7z'; processArgs [2] = 'D:\ docs \ My Games \いくつかのゲームタイトル\ Maps \ Map.map';

これは何らかの理由で、次の名前のzipファイルを吐き出します。bin-debugMyZip.7zしかし、zipは空です。

AIRが行っていることは、パス文字列を欺くことです。私は様々な方法でそれらのパスの周りに引用符を追加しようとしました。何も動作しません。

私はこの例から、バッチファイルを呼び出すに頼ると考えていた: http://technodesk.wordpress.com/2010/04/15/air-2-0-native-process-batch-file/

しかし、それはまだ引数を通過するようにパスを必要とするため、それは同様に失敗します。

NativeProcessで誰かが7zを呼び出したり、フルパスを扱ったりしていますか?これらすべての小さな幸せなチュートリアルは、実際のWindowsフォルダ構造を扱わない。これが機能する理由(上記の記事を参照してください):この上で展開するには

3

このようにJavaScriptでAIR 2.6 SDKを使用していますが、空き領域であってもうまく動作しています。 このコードでコードを確認してください。彼らは "" whithinネストされている場合は、すべての後に

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

がありません。 Vectorはトップレベルのパッケージに含まれています。そうでなければ、私のコードはcmd.exeを呼び出してからパラメータとして渡すことを除いて、あなたのコードとほとんど同じです。私はすでにWindows上のパスにスペースを使用しないよう注意してアプリをリリースしました。再度、感謝します。 – Ska

0
args.push('"blah blah"'); 

コマンドラインには、スペースをサポートしています。私はかつてのような問題を抱えていた

'test/folder with space/blah' 

は、必要に応じてフィルタを使用し、次の

'test/"folder with space"/blah' 

に変換します

だから場合は、ファイルの引数を持って言うことができますこれはAIRで、単に配列にプッシュする前にテキストをフィルタリングするだけです。私のrefrenceはほかに、ファイル名/引数、使用中のスペースを使用するために本当に悪い習慣です

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

もののCASA libにを使用して、ちょうど

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

を経由して、それをフィルタリング代わりに '_'。しかし、これはLinuxに由来しているようです。 (ファイル名にスペースの問題)

3

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

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

nativeProcessStartupInfo.arguments = args; 

は、空気がNativeProcessオブジェクトに渡される引数は、スペースで区切られていることを期待していることです。 「:\スペースで\フォルダmyfile.docをC」(およびところで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]); 
}; 
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; 
0

アプリケーションのパスやパラメータにスペースが含まれる場合は、引用符でそれを包むようにしてください。 - 「nativeProcessStartupInfo.workingDirectory」プロパティとして設定path_with_space私の作品

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

ソリューション:たとえば、アプリケーションのパスは以下のようなスペースC:\Program Files (x86)\Camera\Camera.exe引用符を使用しています。下記の例を参照してください:

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); 
} 
関連する問題