Модераторы: ginnie, korob2001

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запуск программ 
:(
    Опции темы
Rustty
Дата 26.5.2005, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Я начал изучать Перл, и столкнулся с такой диллемой.
ОС у меня Win32, а большинство материала для Перла предназначенна для Nix'ов.
Так вот никака не могу заставить это работать

#!usr/bin/perl -w
Win32::Process::Create($Process,
"c:\\WINDOWS\\system32\\notepad.exe",
"notepad",
0,
DETACHED_PROCESS,
".") || die "Create: $!";

Есть какие идеи?


PM MAIL   Вверх
korob2001
Дата 27.5.2005, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Вот накатал такой пример. Запусти его и если возникнет ошибка, то получишь вразумительное сообщение системы, т.е. увидешь почему он не работает.
Код

#!usr/bin/perl -w
use strict;
use Win32::Process;
my $Process;

sub ErrorMess {
    print Win32::FormatMessage( Win32::GetLastError() );
}

Win32::Process::Create($Process,
"E:\\WINDOWS\\system32\\notepad.exe",
"notepad",
0,
DETACHED_PROCESS,
".") || die ErrorMess;

$Process->Suspend();
$Process->Resume();

while ( 1 ) {
   print "Your want kill this process (y/n): ";
   chomp( my $res = <STDIN> );
   if ( $res =~ /^y(?:es)?$/i ) {
        my $exit;
        $Process->GetExitCode( $exit );
        $Process->Kill( $exit );
        last
   } elsif ( $res =~ /^no?$/i ) {
        sleep 10;
        next;
   }
}

exit 0;

У меня работает.

Зы: Если используешь такие модули, то делай это по максимуму, т.е. выжимай из него всё что можешь. Это я о подпрорграмме ErrorMess, потому как содержимое пременной $! ничего тебе не скажет, если ты работаешь с модулем Win32::Process.

Удачи.

Это сообщение отредактировал(а) korob2001 - 27.5.2005, 03:11


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 27.5.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Спасибо smile
Правда та часть подпрограммы, которая по идеи должна убить процесс

while ( 1 ) {
print "Your want kill this process (y/n): ";
chomp( my $res = <STDIN> );
if ( $res =~ /^y(?:es)?$/i ) {
my $exit;
$Process->GetExitCode( $exit );
$Process->Kill( $exit );
last
} elsif ( $res =~ /^no?$/i ) {
sleep 10;
next;

не работает. Он выводит PRINT но на это -> if ( $res =~ /^y(?:es)?$/i ) {
my $exit;
$Process->GetExitCode( $exit );
$Process->Kill( $exit );

не реагирует.
PM MAIL   Вверх
korob2001
Дата 27.5.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



smile Хм. Странно.
А что за ось???
У меня WinXP Pro и всё чудно работает.
Попробуй в начале ещё указать такую строку:
Код

use Win32;


Это сообщение отредактировал(а) korob2001 - 28.5.2005, 00:59


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 27.5.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Да, теперь заработало. Ось такая же как и у тебя. А можно ещё вопрос, почему "system" не получается пользоваться?
PM MAIL   Вверх
korob2001
Дата 28.5.2005, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Покажи как ты ей пользуешься, я же не телепат. smile Вот тебе пример с system():
Код

#!usr/bin/perl -w
use strict;
use Win32;
use Win32::Process;
my $Process;

sub ErrorMess {
    print Win32::FormatMessage( Win32::GetLastError() );
}

Win32::Process::Create($Process,
"E:\\WINDOWS\\system32\\notepad.exe",
"notepad",
0,
DETACHED_PROCESS,
".") || die ErrorMess;

$Process->Suspend();
$Process->Resume();

while (1) {
   print "\n";
   print "-" x 80, "\n";
   print "Give me system command, for exit press 'q' or 'quit': ";
   chomp( my $sys = <STDIN> );
   last if $sys =~ /^q(?:uit)?$/i;
   print system( $sys );
}

while ( 1 ) {
   print "+" x 80, "\n";
   print "Your want kill this process (y/n): ";
   chomp( my $res = <STDIN> );
   if ( $res =~ /^y(?:es)?$/i ) {
        my $exit;
        $Process->GetExitCode( $exit );
        $Process->Kill( $exit );
        last
   } elsif ( $res =~ /^no?$/i ) {
        sleep 10;
        next;
   }
}

exit 0;

Ладно, попробую немного побыть телепатом. smile
Не работает у тебя, скорее всего потому, что ты пытаешься сохранить результаты выполнения system() в переменную, для дальнейшей обработки. Когда ты хочешь обработать результаты выполнения системной команды, юзай обратные кавычки, примерно так:
Код

my $dir_list = `dir`;
# Теперь переменная $dir_list содержит результ выполнения системной команды.


Удачи. smile

ЗЫ: При вставке кода в сообщение, пользуйся кнопкой "КОД"

Это сообщение отредактировал(а) korob2001 - 28.5.2005, 01:03


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 31.5.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



ну вообщето Я пытался использовать System так

Код Perl
system("с:\\windows\\system32\notepad.exe >right_now") && die "cannot create right_now";

но такая конструкция у *никсов,как Я понял.
Добавлено @ 17:06
блин
"Код" Perl
system("с:\\windows\\system32\notepad.exe >right_now") && die "cannot create right_now";
Добавлено @ 17:06
smile
PM MAIL   Вверх
korob2001
Дата 31.5.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Найди ошибку:
Код

system("с:\\windows\\system32\notepad.exe >right_now")

Подсказка: \n - это перевод строки. Может потому и не работает?? smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 31.5.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



smile Неа, сам понял

"Код"

#!usr/bin/perl -w
system("c:\\WINDOWS\\system32\\notepad.exe >right_now"); --> работает


Хотя по сути такойже

"Код"

#!usr/bin/perl -w
system("C:\\Program Files\\Winamp\\winamp.exe >right_now"); не работает








Добавлено @ 20:24
Кстати извини только сейчас заметил "код",

думал его как HTMLевский тэг надо использовать smile
PM MAIL   Вверх
korob2001
Дата 1.6.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата

system("C:\\Program Files\\Winamp\\winamp.exe >right_now"); не работает

А почему как думаешь???
Попробуй так:
Код

system q("E:\\Program Files\\Winamp\\winamp.exe" >right_now);

Ну думаю тут пояснений не нужно, но если возникнут вопросы, пиши.

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 1.6.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Одну ощибку увидел и понял. Это ковычки,Перл рассматривает путь до exe вплоть до закрытия ковычек.

>right_now" было глупо smile

Но функцию q так и не понял,а без неё не работает.
Единственную функцию q, что я нащёл это что все последние метасимволы становятся обычными символами, но это работа с текстом, что сюда непременительно.

Есть ещё лдин вопрос, если при помощи system так легко создать процесс зачем тогда использовать громоздкое
Код


[code=perl]

use strict;
use Win32::Process;
my $Process;
PM MAIL   Вверх
korob2001
Дата 1.6.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата

Но функцию q так и не понял,а без неё не работает.
Единственную функцию q, что я нащёл это что все последние метасимволы становятся обычными символами, но это работа с текстом, что сюда непременительно.

Можно присвоить переменной строку так:
Код

my $str = 'Hello';
# Или так
my $str = q|Hello|;
# или так
my $str = q<Hello>;
# или так
my $str = q(Hello);
# или так
my $str = q!Hello!;
# и т.д.

Все эти присвоения абсолютно эквивалентны, присвоению переменной строки в одинарных кавычках. Т.е. твою строку можно было бы записать так:
Код

system '"E:\\Program Files\\Winamp\\winamp.exe" >right_now';

И она будет работать точно так же. Тоже самое можно вытворять и с двойными кавычками, только нужно добавить ещё одну q, т.е:
Код

my $str = "Hello";
# Или так
my $str = qq|Hello|;
# или так
my $str = qq<Hello>;
# или так
my $str = qq(Hello);
# или так
my $str = qq{Hello};
# и т.д.

Это очень удобно, когда в строке в двойных кавычках, нужно вставить двойные кавычки, вот пример:
Код

my $title = "Perl";
# В следующей строке, нам нужно интерполировать переменную $title в двойных кавычках:
print qq|Мне нравятся все языки программирования, но больше всего я люблю "$title"\n|;
# А теперь стандартным способом
print "Мне нравятся все языки программирования, но больше всего я люблю \"$title\"\n";

Заметь, вариант с qq|| намного убнее для чтения программы, в нём нам не пришлось перекрывать кавычки обратным слешем.

Думаю этот вопрос мы достаточно разобрали. smile

Цитата

Есть ещё лдин вопрос, если при помощи system так легко создать процесс зачем тогда использовать громоздкое

Потому что system() просто передаёт на выполнение комаду оболочке, т.е. просходит примерно следующее: Когда Perl встречает system("команда"), сначала он интерполирует все переменные, если они там есть, затем он передаёт команду оболочке. Запускается внешний процеесс cmd.exe, именно он выполняет твою команду ( а на запуск внешнего процесса уходит не мало времени ), Perl.exe в это время ожидает ответа, т.е. пока cmd.exe выполняет полученную команду, Perl.exe просто бездействует, что не есть гуд. Когда он получает ответ, то тут же выводит его в STDOUT и продолжает выполнение программы.
Вобщем работать с модулем намного удобнее, безопаснее и программа будет выполняться быстрее, так как ей не нужно будет ждать ответа оболочки и запускать лишний процесс. Конечно если тебе нужно просто запустить notepad.exe, то наверное гораздо разумнее заюзать system(), если же тебе нужно ещё и управлять процессами, то лучше заюзать модуль.


PS: Когда жмёшь на кнопку код, появляются такие тэги:

Код

[codе=реrl]

# тута твой код, т.е. между ними

[/соdе]


Удачи.

Это сообщение отредактировал(а) korob2001 - 1.6.2005, 18:36


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 1.6.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Спасибо smile
Будут ещё вопросы уже задам в новом тоике
PM MAIL   Вверх
korob2001
Дата 1.6.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Пропустил это.
Цитата

Одну ощибку увидел и понял. Это ковычки,Перл рассматривает путь до exe вплоть до закрытия ковычек


Нет. Perl рассматривает эту строку так, как нужно, а вот cmd.exe предполагает, что ты пытаешься запустить файл: C:\\Program, а остальную часть: Files\\Winamp\\winamp.exe, >right_now он рассматривает как параметры. Это всё из-за пробела в пути в имени каталога /Program Files. Другими словами, запуск программы из MS-DOS выглядит примерно так:

C:\>исполняемый_файл /ключь параметр1 параметр2 параметр3

Отсюда видно что всё разделено пробелом. Если же нужно указать путь где есть пробел, то в MS-DOS это делается следующим образом:

D:\>"C:\Program Files\Winamp\winamp.exe" /ключь параметр1 параметр2

Вот мы и захватили в каввычки путь к файлу, так как в нём есть пробелы. Т.е. когда ты вызываешь system("команда") или `команда`, ты должен использовать синтаксис не Perl, а MS-DOS, потому как и именно он будет работать с твоей командой.

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 2.6.2005, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Аха,спасибочки.
Ну тогда ещё вопрос. Перл может передовать файлы через Интернет(tcp/ip), мэйл?
Codding не нужен, если да тогда сам его надумаю. smile
PM MAIL   Вверх
korob2001
Дата 2.6.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Конечно может, собственно это и было его изначальное предназначение.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Sadok
Дата 3.6.2005, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Rustty
Цитата
Перл может передовать файлы через Интернет(tcp/ip), мэйл?

Net::FTP - работаем с FTP
Net::SMTP - передаем почту
Net::POP3 - забираем почту
LWP - библиотека для www (почитай lwpcook, там куча примеров для нее)

Мне этого хватает, но есть еще куча всяких разных. http://search.cpan.org
PM   Вверх
Rustty
Дата 3.6.2005, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



А что возможен Upload? Можно сделать скрипт для скачивания файлов на определённый FTP сервер?
PM MAIL   Вверх
korob2001
Дата 3.6.2005, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Возможно всё, главное желание. smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Rustty
Дата 7.6.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Извините за назойливость,искал в Нете скрипты для FTP upload, и наткнулся на такой простенькийй пример. Прощу помощи для его настройки под мой компьютер,так как пока у меня не получается.
Код


[code=perl]
#!usr/bin/perl -w
sub ftp_extract {
my ($ftp_host) = @_;

my $ftp_input_file = "ad_extract.full";
my $ftp_output_file = "ad_extract.full";
my $ftp;
my $ftp_error = 0;


$ftp = Net::FTP->new ($ftp_host, timeout=>30, debug=>1) or $ftp_error=1;
if ($ftp_error) {

return 0;
}
$ftp->login ($ftp_user,$ftp_pass) or $ftp_error=1;
if ($ftp_error) {
$ftp->quit;

return 0;
}
$ftp->put ($ftp_input_file,$ftp_output_file) or $ftp_error=1;
if ($ftp_error) {
$ftp->quit;

return 0;
}
$ftp->quit;
return 1;
}

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.