Скрипты в LAZARUS
Модератор: Модераторы
Скрипты в LAZARUS
Всем привет!
(UBUNTU 11.04)
Вот такой вопрос у меня есть - Можно ли программно запустить на выполнение скрипт, типа того что мы пишем в консоли, и чтобы программа узнала, когда скрипт закончил свою работу?
(UBUNTU 11.04)
Вот такой вопрос у меня есть - Можно ли программно запустить на выполнение скрипт, типа того что мы пишем в консоли, и чтобы программа узнала, когда скрипт закончил свою работу?
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
изучайте вопрос по TProcess
Padre_Mortius писал(а):изучайте вопрос по TProcess
Спасибо. Как сказала бы Машенька: "Давай-давай учиться"
Добавлено спустя 34 минуты 30 секунд:
Padre_Mortius писал(а):изучайте вопрос по TProcess
Зашел, почитал, попробовал - не получилось.
Что я должен сделать по аналогии, если в консоли я пишу:
Код: Выделить всё
cd /media/Файлы/Lazarus/Проекты/
upx --best MainЯ не пойму что я должен в таком случае написать здесь
Код: Выделить всё
AProcess.CommandLine := QuotedStr('upx --best Main /media/Файлы/Lazarus/Проекты/');-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
uses unix;
if fileexists('/media/Файлы/Lazarus/Проекты/main')=true then
begin
shell('bash -c "upx --best /media/Файлы/Lazarus/Проекты/main"');
showmessage('Бинарник упакован');
end;
if fileexists('/media/Файлы/Lazarus/Проекты/main')=true then
begin
shell('bash -c "upx --best /media/Файлы/Lazarus/Проекты/main"');
showmessage('Бинарник упакован');
end;
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Код: Выделить всё
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := 'upx --best /media/Файлы/Lazarus/Проекты/Main';
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;Padre_Mortius писал(а):Код: Выделить всё
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := 'upx --best /media/Файлы/Lazarus/Проекты/Main';
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;
Здесь никто ни на кого не ругается, но скрипт почему-то не работает. Это видно из того что файл Main.upx не появился, да и файл остался прежним.
Добавлено спустя 1 минуту 52 секунды:
alex208210 писал(а):uses unix;Код: Выделить всё
if fileexists('/media/Файлы/Lazarus/Проекты/main')=true then
begin
shell('bash -c "upx --best /media/Файлы/Lazarus/Проекты/main"');
showmessage('Бинарник упакован');
end;
Здесь появляется ошибка:
Код: Выделить всё
_main.pas(48,11) Error: Identifier not found "shell"Добавлено спустя 2 минуты 35 секунд:
А вообще неплохо было бы где-то почитать на эту тему. Ведь этот скрипт я взял как пример. А может быть ведь последовательность команд, таких как это:
Код: Выделить всё
ffmpeg -i input.mpg \
-vcodec h263 -s qcif -r 15 -b 100k \
-acodec libfaac -ac 1 -ar 32000 -ab 64k \
output.3gp-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
Здесь появляется ошибка:
Код: Выделить всё
_main.pas(48,11) Error: Identifier not found "shell"
uses unix; не спроста там написан..
alex208210 писал(а):uses unix; не спроста там написан..
Виноват. Не обратил внимание. Теперь ошибки не выдает, сообщение, что "Бинарник упакован" получаю ТУТ ЖЕ! Но скрипт не запускается...
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
Код: Выделить всё
function Tform1.shellv(commd:string):ansistring;
var
S : TProcess;
Buf: ansistring;
Count : longint;
begin
S:=TProcess.Create(Nil);
S.Commandline:=commd;
S.Options:=[poUsePipes,poNoConsole];
S.execute;
SetLength(buf, 1000);
Repeat
Count:=s.output.read(buf[1], length(buf));
result:=result + Copy(buf, 1, Count-1);
until Count=0;
S.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.add(shellv('bash -c "upx --best /media/Файлы/Lazarus/Проекты/main"'));
end;
что в memo1 выводит?
alex208210 писал(а):uses unix;
if fileexists('/media/Файлы/Lazarus/Проекты/main')=true then
begin
shell('bash -c "upx --best /media/Файлы/Lazarus/Проекты/main"');
showmessage('Бинарник упакован');
end;
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
begin
if fileexists('/media/Файлы/Lazarus/Проекты/Запуск консоли/Main1')=true then
begin
shell('bash -c "upx --best Main1 /media/Файлы/Lazarus/Проекты/Запуск консоли"');
showmessage('Бинарник упакован');
end;
end;Вот так - работает. Спасибо большое
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
если нужно запускать сформированный скрипт то можно сначало его сформировать а потом выполнить консолью:
Код: Выделить всё
shellv('bash -c "echo ''#!/bin/bash'' > /scr.sh"');
shellv('bash -c "echo ''ffmpeg -i input.mpg \'' >> /scr.sh"');
shellv('bash -c "echo ''-vcodec h263 -s qcif -r 15 -b 100k \'' >> /scr.sh"');
shellv('bash -c "echo ''-acodec libfaac -ac 1 -ar 32000 -ab 64k \'' >> /scr.sh"');
shellv('bash -c "echo ''output.3gp'' >> /scr.sh"');
shellv('bash -c "chmod +xxx /scr.sh"');
shellv('xterm /scr.sh');
alexsa писал(а):Код: Выделить всё
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := 'upx --best /media/Файлы/Lazarus/Проекты/Main';
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;
Стало работать, когда сделал так:
Код: Выделить всё
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := 'bash -c "upx --best Main /media/Файлы/Lazarus/Проекты"';
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
если у вас работает эта команда, то Убунта странная система
на федоре результатом выполнения данной команды является ошибка
Код: Выделить всё
upx --best Main1 /media/Файлы/Lazarus/Проекты/Запуск консолина федоре результатом выполнения данной команды является ошибка
Код: Выделить всё
IOException: not a regular file -- skippedPadre_Mortius писал(а):если у вас работает эта команда, то Убунта странная системаКод: Выделить всё
upx --best Main1 /media/Файлы/Lazarus/Проекты/Запуск консоли
на федоре результатом выполнения данной команды является ошибкаКод: Выделить всё
IOException: not a regular file -- skipped
Не знаю, насколько она странная. Но именно так и стало работать. Я почему решил попробовать так? Ведь в консоли, после того как перешел в каталог программы, выполнял команду именно так:
Код: Выделить всё
upx --best Main1