Kopia bazy danych Firebird

0

Delphi 10.4 + Firebird 5.
Usiłuję wykonać kopię bazy danych w następujący sposób :

ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe -B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, nil, SW_NORMAL)

Niestety powyższa konstrukcja nie działa i nie mam pojęcia dlaczego. Może ktoś bieglejszy w temacie pomoże ?.

3

Spróbuj dać ścieżki (głównie tą pierwszą) w podwójnym cudzysłowie. Jak jest spacja w ścieżce to dalszą część interpretowana jest jako kolejny parametr.

0

Utworzyłem tymczasowy katalog c:xxx (aby pozbyć się ewentualnych spacji) , przekopiowałem do niego gabak.exe oraz data.fdb i niestety nic to nie dało.

0

Wpisywałeś tą komendę normalnie w wierszu poleceń? Jeżeli coś jest nie tak to może będzie jakieś sensowne info. Poza tym nie wiem czy to ma znaczenie ale
https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/gbak/firebird-gbak.html
Masz gbak -b <db set> <backup set> [backup options] [general options]
a więc zgodnie z tym raczej powinno być gbak.exe -b C:\AppName\data.fdb c:\AppName\data.fbk -USER SYSDBA -PAS masterkey

0
jurkowojc napisał(a):

Utworzyłem tymczasowy katalog c:xxx (aby pozbyć się ewentualnych spacji) , przekopiowałem do niego gabak.exe oraz data.fdb i niestety nic to nie dało.

W wierszu poleceń zadanie wykonuje się bez problemu !
W przypadku c:\program files ... należy użyć pdwójny cudzysłów (sugestia kolegi Clark), Co ciekawe , format zapisu jak u mnie czy u kolegi (kAzek) nie ma znaczenia.

2

Bez względu na to jaki program się odpala, jeśli przyjmuje ścieżkę w parametrze, to taką ścieżkę zawsze należy objąć cudzysłowami. Te nie przeszkadzają w przypadku ścieżek pozbawionych białych znaków, natomiast jeśli ścieżka zawiera białe znaki, to brak cudzysłowów spowoduje, że fragmenty ścieżki zostaną uznane za osobne parametry — argc będzie miał większą wartość niż się spodziewasz, natomiast kawałki ścieżki zostaną rozrzucone po kilku sąsiadujących komórkach argv.

System nie zna intencji użytkownika, więc nie domyśli się, że ma kilka ciągów zbić w jeden ciąg ścieżki (i nawet zgadywać nie próbuje). Przy poprawnie przekazanych ścieżkach, nie ma powodu, aby tak odpalony program nie zadziałał, bo nieistotne czy uruchomi się go z dysku, czy z konsoli, czy za pomocą ShellExecute, system zrobi dokładnie to samo w każdym z tych przypadków.

1

@jurkowojc a czy przypadkiem problemem nie jest brak uprawnienia do zapisu plików w podanych przez ciebie ścieżkach? Spróbuj uruchomić aplikację z uprawnieniami administratora i sprawdź, czy to nie rozwiąże problemu.

0
skrzat napisał(a):

@jurkowojc a czy przypadkiem problemem nie jest brak uprawnienia do zapisu plików w podanych przez ciebie ścieżkach? Spróbuj uruchomić aplikację z uprawnieniami administratora i sprawdź, czy to nie rozwiąże problemu.

Próbowałem również jako administrator. Nie pomogło.

0
var code := ShellExecute(Handle, 'open', PChar('"c:\Program Files\Firebird\Firebird_5_0\gbak.exe" -b C:\AppName\data.fdb c:\AppName\data.fbk -USER SYSDBA -PAS masterkey'), nil, nil, SW_NORMAL);
ShowMessage(code.toString);

Wklej u siebie, uruchom i powiedź co się wyświetliło.

2

SellExecute ma osobny parametr na przekazywanie ciągu z parametrami dla aplikacji - poniższy kod powinien zadziałać:

ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe',
  '-B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, SW_NORMAL);
0
Paweł Dmitruk napisał(a):

SellExecute ma osobny parametr na przekazywanie ciągu z parametrami dla aplikacji - poniższy kod powinien zadziałać:

ShellExecute(Handle, 'open', 'c:\Program Files\Firebird\Firebird_5_0\gbak.exe',
  '-B -USER SYSDBA -PAS masterkey C:\AppName\data.fdb c:\AppName\data.fbk', nil, SW_NORMAL);

OK! TO ZADZIAŁAŁO !
Muszę teraz na spokojnie przeanalizować kod.

Wykonanie kodu kolegi Clarc zwróciło kod 2;

Wielkie dzięki !

0

Ponieważ apetyt rośnie w miarę jedzenia to z czystej ciekawości krótkie pytanko :
jakiego polecenia należy użyć aby móc podejrzeć to co proces aktualnie wykonuje i kiedy się zakończy.
Czytałem o createprocess ale nie wiem czy spełni moje ewentualne oczekiwania.

1
jurkowojc napisał(a):

jakiego polecenia należy użyć aby móc podejrzeć to co proces aktualnie wykonuje i kiedy się zakończy.

Zadajesz pytania bardzo nieprecyzyjnie, więc trudno cokolwiek sensownego doradzić. Żeby można było podglądać co proces robi i wiedzieć kiedy skończy, ten proces musiałby się w jakiś sposób komunikować z otoczeniem, np. wypisywać stan postępu na standardowe wyjście, uzupełniać file mapping, rozsyłać komunikaty do pozostałych okien (message broadcasting) itd. Jeśli tego nie robi, to niczego się o postępie nie dowiesz — możesz tylko wykryć moment zakończenia jego działania.

Podglądanie standardowego wyjścia procesu jest dość łatwe w Lazarusie — pozwala na to np. standardowa klasa TProcess. Za jej pomocą można wygodnie odpalić dowolny program z dysku, przekazać mu parametry, podglądać standardowe wyjście, a także czekać (lub nie) na zakończenie jego działania. W dodatku wszystko wieloplatformowe.

Dla Delphi jest port, na razie tylko na Windows. W razie czego, klasa TProcess pod Windows tak czy siak używa funkcji z Win32 API, więc równie dobrze możesz popatrzeć na to jak jest zaimplementowana, wyciągnąć z niego tylko to co cię interesuje i napisać sobie własną, małą klasę, która spełni twoje wymagania. Albo po prostu zaimplementować rozwiązanie w czystym Win32 API, jeśli tak wolisz.

1

Tak jak wspomniał @furious programming jeżeli program przekazuje dane na standardowe wyjście to możesz to przechwycić - tutaj masz przykład dla Delphi: https://stackoverflow.com/questions/9119999/getting-output-from-a-shell-dos-app-into-a-delphi-app

1

Tu jest "ciekawy" unit do tego: https://github.com/t-edson/UnTerminal

0

Dziękuję wszystkim za pomoc !
Zainteresowałem się TProcess gdyż przy jego pomocy mogę zrobić wszystko co potrzebuję, a jestem pewien, że również znacznie więcej !
Na razie informacja o zakończeniu procesu wraz z informacją o statusie zakończenia mnie satysfakcjonuje. Przy odrobinie wolnego czasu
zgłębię temat bardziej gdyż na pewno warto.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.