CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pobieranie wyników działania skryptu *nixowego do Memo1

Pobieranie wyników działania skryptu *nixowego do Memo1

dział ogólny

Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » środa, 2 lutego 2011, 21:56

Witam

Piszę prostą aplikację, której zadaniem będzie uruchomienie innego programu z parametrami, połączenie do zdalnego serwera i po zalogowaniu odpalenie skryptów, a później wyświetlenie wartości w Memo1.
Pojawiło się wiele problemów, bo z tego co widzę połączenia po ssh wraz z logowaniem nie są takie proste, jednak poradziłem sobie w taki sposób:
WinExec("C:\\program_łączący_się_po_ssh.exe -opcje", SW_SHOW);
Jak widać ścieżka do programu jest ujęta w cudzysłów, a ja potrzebuję wstawić kolejną wartość także w znaczkach "". Jak mogę to zrobić? Myślałem o wykorzystaniu Edit1, ale tu mam maleńki problem z konwersją. Pytanie brzmi - jak poprawić konwersję w tym zapisie kodu i jak wpleść ją w pozostała część polecenia, aby wiadome było, że to jedna z opcji, z którymi odpalam plik?:

Kod: Zaznacz cały
int x = Edit1->Text;
WinExec("C:\\program_łączący_się_po_ssh.exe -opcje", SW_SHOW);


Po drugie dodam, że powyższe polecenie ma odpalić zdalny skrypt. W tym przypadku nie jestem pewny jak przechwycić i wrzucić do Memo1 wynik każdego polecenia biorąc pod uwagę, że liczba znaków może być zmienna ( ale to chyba raczej nieistotne ).
Przepraszam za poziom moich pytań, ale programuję "od święta" i zawsze bardzo proste aplikacje. Tutaj utrudniłem sobie życie i widzę, że sam nie wykombinuję za wiele.

Z góry dziękuję.
Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez polymorphism » środa, 2 lutego 2011, 22:10

a ja potrzebuję wstawić kolejną wartość także w znaczkach "". Jak mogę to zrobić?

O to chodzi?
KOD cpp:     UKRYJ  
"C:\\program_łączący_się_po_ssh.exe -opcje \"kolejna wartosc w znaczkach\""
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » środa, 2 lutego 2011, 23:03

Nie mam na tym komputerze kompilatora, więc sprawdzę jutro po 12, ale pewnie masz rację, o ile przejdzie kompilację :-) Dam znać.
Masz lub ktokolwiek jakiś pomysł co do drugiej części ( wczytania danych ze skryptu do Memo1 )?

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 09:35

Jak ten skrypt wyrzuca te dane? Jakiego rodzaju to skrypt? W czym skrypt wyświetla dane, do czego zapisuje, itp...?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 10:24

Jest to skrypt w bashu, który przeszukuję bazę danych na serwerze, z którym mój program się łączy.
Dane po sformatowaniu wyświetlane są jako zwykły tekst i nie są nigdzie zapisywane.
Dokładnie to wygląda tak:
Łączymy się do serwera, uruchamiamy skrypt z określonymi parametrami, a on wyświetla dane na ekran_programu_do_ssh.
Przyjąć można na przykład, że zamiast tego skryptu chcę w Memo1 otrzymać to co wyrzuci polecenie ping ( oczywiście wydane na zdalnym hoście ).

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 10:29

Przyjąć można na przykład, że zamiast tego skryptu chcę w Memo1 otrzymać to co wyrzuci polecenie ping ( oczywiście wydane na zdalnym hoście ).


No chyba nie to samo, gdyż polecenie ping wyświetla wyniki w oknie konsoli CMD. Gdyby to miało wyglądać jak w przypadku konsoli to swego czasu kinio opracował odpowiedni kod, dostępny w serwisie Cyfrowy Baron w dziale: porady -> różne 2 -> Wyświetlanie zawartości konsoli CMD.exe w Memo - wg. pomysłu kinio.

Skoro skrypt nigdzie nie zapisuje wyników, to może to być niemożliwe. Ewentualnie możesz spróbować pobrać uchwyt do okna z wynikami, potem do obiektu na którym wyniki są wyświetlane, a potem spróbować wyciągnąć z tego tekst, ale to się uda tylko wtedy, gdy ten obiekt z wynikami jest elementem interfejsu API.

Na podobnym problemem pracuje Corvis, tylko jego skrypt zapisuje wyniki w pliku, co znacznie ułatwia zadanie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 11:26

No dobrze, a co myślisz o przypisaniu wyniku polecenia WinExec do wartości Memo1?
Czy takie coś w ogóle ma prawo zadziałać?:
Kod: Zaznacz cały
Memo1->Lines = WinExec("c:\\program", SW_SHOW);


Skąd w ogóle ten problem, że trzeba wykorzystać PipeCtrl?
Czy w żaden inny sposób nie można zamienić wyświetlania przez konsolę na wyświetlanie w Memo1?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez polymorphism » czwartek, 3 lutego 2011, 11:28

Jeśli program wypluwa dane przez standardowe wyjście, to trzeba użyć rur. Swego czasu był wątek na ten temat (bodajże Darek_C++ go założył).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 12:00

Ok, a gdyby te wszystkie dane były zapisywane do pliku po stronie serwera?
Obeszlibyśmy wtedy rury i dałoby się to osiągnąć?
Ciekawe w takim razie jak putty wyciąga dane ze zdalnego serwera, bo przecież właśnie na tej zasadzie to działa.
Ps.: Zaraz będę w pracy, więc wszystko posprawdzam.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 12:48

Czy takie coś w ogóle ma prawo zadziałać?:


Absolutnie nie. Gdybyś zajrzał do pomocy to byś zobaczył, że funkcja WinExec po zakończeniu działania sukcesem zwraca wartość typu UINT większą od 31, a w przypadku błędu:

0 - The system is out of memory or resources.
ERROR_BAD_FORMAT - The .exe file is invalid.
ERROR_FILE_NOT_FOUND - The specified file was not found.
ERROR_PATH_NOT_FOUND - The specified path was not found.

Ta funkcja służy tylko do uruchamiania plików wykonywalnych. Poza tym w opisie funkcji można przeczytać: This function is provided only for compatibility with 16-bit Windows. Zasadniczo to do uruchamiania aplikacji powinieneś używać funkcji CreateProcess, ewentualnie ShellExecute. To oczywiście nie rozwiąże Twojego problemu, ale będzie bardziej zgodne z Windows.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 13:30

@Baronie
Udało mi się zapisać dane do pliku, teraz chciałbym je odczytać w Memo1 przy czym dane są na zdalnym serwerze.
Kombinuję z wykorzystaniem INDY i ściągnięciem pliku przez ftp na dany komputer. Dzięki temu odczyt pliku z dysku będzie banalnie prosty.
Mam też taką małą zagwozdkę. Ten program powinien wywołać polecenie na danym hoście, zapisać wynik do pliku i ściągnąć go, a następnie zrobić to samo, ale na innym hoście.
Czy można tak napisać program, aby robił oba zadania równocześnie, ale także czekał na wynik, bo w końcu musi ściągnąć przez ftp dane na dysk i je odczytać do Memo1 ( co może być na samym końcu ). Z tym, że wolałbym uniknąć ponownego logowania, czyli sesja musiałaby być utrzymana.

@polymorphism
Cudzysłów działa bardzo dobrze, dzięki ;)
Jeśli można, poproszę jeszcze o pomoc we wpleceniu w WinExec("c:\\"); opcji Edit1->Text;
Chciałem to zrobić tak:
Kod: Zaznacz cały
int x;
x = Edit1->Text.ToInt();


Tylko nie wiem jak wynik ( x ) wrzucić w WinExec.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez polymorphism » czwartek, 3 lutego 2011, 14:09

Jeśli chcesz ten x podać jako parametr wywołania, czyli w formie tekstu, to po co konwertujesz go na postać binarną? Może wyjaśnij, jak to 'wplecenie' ma dokładnie wyglądać.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 14:17

Chciałbym zdefiniować w EditX części składowe, które posłużą do odpalenia programu przez WinExec, przykładowo tak:
Kod: Zaznacz cały
WinExec("C:\\telnet" Edit1->Text, SW_SHOW);

gdzie Edit1->Text zawiera adres hosta, na który ma się wywołać telnet.
W innych EditX będą także dane typu login i hasło.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez polymorphism » czwartek, 3 lutego 2011, 14:31

Po prostu:
KOD cpp:     UKRYJ  
"C:\\telnet" + Edit1->Text
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Pobieranie wyników działania skryptu *nixowego do Memo1

Nowy postprzez nvdante » czwartek, 3 lutego 2011, 14:37

No właśnie nie bardzo :/
Zobacz to;
Kod: Zaznacz cały
WinExec("C:\\program " + Edit1->Text + "@ip_hosta", SW_SHOW);

Według tego co piszesz powinno zadziałać, a jednak dostaje info, że:
    [C++ Error] Unit1.cpp(20): E2034 Cannot convert 'AnsiString' to 'const char *'
    [C++ Error] Unit1.cpp(20): E2342 Type mismatch in parameter 'lpCmdLine' (wanted 'const char *', got 'AnsiString')
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości

cron