Как я могу при нажатии кнопки выполнить команду в командной строке и получить обратно выходные данные в ActionScript?

#flash #actionscript-3 #actionscript #actionscript-2

#flash #actionscript-3 #actionscript #actionscript-2

Вопрос:

У меня есть графический интерфейс, использующий Flex. У меня есть условие, например, мне нужно выполнить некоторые аргументы командной строки на локальном компьютере и получить результаты обратно или вывести обратно в область текстового поля. Как я могу нажать кнопку отправки, выполнить команду на локальном компьютере и вернуть выходные данные?

 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

Комментарии:

1. button1.onRelease — это AS2, почему вы помечаете его как AS3?

2. Я хотел бы сделать то же самое для AS2, AS3 тоже.

3. Лора, пожалуйста, посмотри мой ответ. Это просто невозможно с AS2 или даже AS3 из браузера. Вам нужны собственные расширения, и flash Player специально избегает этого, чтобы избежать проблем с безопасностью. Вам нужен модифицированный проектор flash Player или, в лучшем случае, Adobe AIR 2.0 или более поздней версии, для которого потребуется использование Actionscript 3.

Ответ №1:

Вы не сможете сделать это с помощью actionscript 2, и вы не сможете сделать это с помощью actionscript 3 во flash web Player. Существуют определенные инструменты, которые вы можете использовать для создания проекторов с использованием actionscript 2 и 3, чтобы добавить такого рода расширенные возможности, но вы не можете просто сделать это из Интернета, поскольку, конечно, это было бы крайней угрозой безопасности.

Однако вы можете сделать это с Adobe AIR 2.0 или более поздней версии. Вы используете класс NativeProcess и определяете операционную систему, запускаете терминал или cmd.exe и затем вы можете запускать команды против него. Ниже приведен некоторый код из проекта, который я разработал для запуска команд в ОС с использованием AIR, как вы пытаетесь сделать:

             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 для проверки ОС при обработке вывода, поскольку можно с уверенностью предположить, что то, что вы делаете дальше с выводом, также будет зависеть от ОС (или, по крайней мере, в моем случае так и было). Если вам нужна дополнительная помощь в понимании всего этого, я предлагаю поискать в Google руководство по Adobe AIR Native Process API или просто опубликовать еще несколько вопросов здесь. 🙂

Комментарии:

1. Также обратите внимание, что в качестве одного из примеров того, что этот код не совсем завершен, код начинается с того, что я получаю StorageVolumeChangeEvent, потому что в этом приложении я действую всякий раз, когда монтируется новый USB-ключ. Часть кода, которая прослушивает эти события, а также инструкции import отсутствуют.