2011-05-26 72 views
2

我有一个使用Flex的GUI。我有一个条件,如我需要在本地机器上执行一些命令行参数,并返回结果或输出回到文本框区域。我如何做一个按钮提交,在本地机器执行命令并返回输出?如何在按钮上按下在命令提示符下执行命令并获取ActionScript中的输出?

Command to execute example: 

    echo logfile.log | grep username 

Code: 

button1.onRelease = function() 
{ 
    // in this computer, it will now run a command, please wait. 
} 

从回答我参考:https://gist.github.com/993905

+0

button1.onRelease是AS2你为什么要将它标记为AS3? – 2011-05-26 19:11:41

+5

我也想为AS2,AS3做同样的事情。 – YumYumYum 2011-05-26 19:29:27

+1

劳拉请看我的答案。在浏览器中,AS2甚至AS3都不可能。您需要本机扩展,并且Flash播放器专门避免此问题以避免安全问题。您需要一个经过修改的Flash播放器投影机,或者最好是Adobe AIR 2.0或更高版本,这需要使用Actionscript 3. – 2011-05-26 19:32:28

回答

7

你不会是能够做到这一点使用ActionScript 2,你就不会成为能够做到这一点使用ActionScript 3 flash网页播放器。您可以使用某些工具创建使用动作脚本2和3的投影仪来添加这种扩展功能,但不能简单地通过网络来完成,因为这当然会带来极大的安全风险。

但是,您可以使用Adobe AIR 2.0或更高版本执行此操作。您可以使用NativeProcess类并检测操作系统,启动终端或cmd.exe,然后可以针对它运行命令。下面是我在一个项目开发运行使用AIR就像你正在试图做的对OS命令一些代码:

  private var os:String; 
      private var consoleExecutable:File; 
      private var consoleNativeProcess:NativeProcess; 

      private function usbMounted(e:StorageVolumeChangeEvent):void 
      { 
       //status.appendText('Device: ' + e.storageVolume.name + ' mounted to drive: ' + e.storageVolume.drive + '\n'); 

       os = Capabilities.os.substr(0, 3).toLowerCase(); 

       switch (os) 
       { 
        case "win": 
         //Windows OS 
         var rootDirs:Array = File.getRootDirectories(); 

         var i:int = 0; 
         for (i; i < rootDirs.length; ++i) { 
          consoleExecutable = rootDirs[i] as File; 
          consoleExecutable = consoleExecutable.resolvePath("Windows"); 
          if (consoleExecutable.exists == true) { 
           consoleExecutable = consoleExecutable.resolvePath("System32"); 
           consoleExecutable = consoleExecutable.resolvePath("cmd.exe"); 
           i = rootDirs.length;          
          }     
         } 

        break; 

        case "lin": 
         //Linux OS 

        break; 

        case "mac": 
         //Mac OS 

        break; 

        case "iph": 
         //Iphone OS 

        break; 
       } 

       var consoleNativeProcessStartupNfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
       consoleNativeProcessStartupNfo.executable = consoleExecutable; 
       var startupArgs:Vector.<String> = new Vector.<String>(); 

       startupArgs.push('/C fsutil fsinfo volumeinfo ' + e.storageVolume.drive + ':'); 

       consoleNativeProcessStartupNfo.arguments = startupArgs;   
       consoleNativeProcess = new NativeProcess(); 
       consoleNativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, consoleOutput);   
       consoleNativeProcess.start(consoleNativeProcessStartupNfo);   
       consoleNativeProcess.closeInput(); 
      }  

      private function consoleOutput(e:ProgressEvent):void 
      { 
       var consoleOuput:String = consoleNativeProcess.standardOutput.readUTFBytes(consoleNativeProcess.standardOutput.bytesAvailable); 

       switch (os) 
       { 
        case "win": 
         //Windows OS 

        break; 

        case "lin": 
         //Linux OS 

        break; 

        case "mac": 
         //Mac OS 

        break; 

        case "iph": 
         //Iphone OS 

        break; 
       } 

       consoleNativeProcess.exit(); 
      } 

因此,代码应该是相当直截了当。它可能不会全部存在,因为我刚刚复制了处理本机进程启动,输出和终止的代码部分。然后我删除了部分敏感的代码。基本上你只是获取操作系统信息,导航到可执行文件的路径,检查它是否存在,如果是,启动它,运行一个命令,等待输出。我也在switch语句中检查了操作系统在处理输出时的情况,因为可以安全地假设你接下来做什么,输出也会依赖于操作系统(或者至少在我看来是这样)。如果您需要更多帮助了解所有这些信息,我建议您在Adobe AIR Native Process API上使用Google教程,或者在此处发布更多问题。 :)

+1

另请注意,作为此代码不完整的一个示例,代码从我开始接收StorageVolumeChangeEvent,因为在这个应用程序中,每当装入新的USB密钥时,我都会采取行动。侦听这些事件的代码部分以及导入语句都丢失了。 – 2011-05-26 19:39:51

相关问题