Ciąg poleceń CMD po sobie

0

Witam,

szperałem w necie, coś kombinowałem (może za słabo?) ale nie udaje mi się wykonać kilku poleceń CMD po sobie. Kolejny zgłasza błąd w nowym oknie, że plik jest zajęty przez inny proces.

Przykładowy kod:

                      Process p = Runtime.getRuntime().exec("reg export \"HKEY_LOCAL_MACHINE\\Hardware\" c:\\temp\\rejestr.reg");
		      p.waitFor();
		      Process q = Runtime.getRuntime().exec("cmd.exe /c start copy c:\\temp\\rejestr.reg c:\\moje\\rej01.reg");
		      q.waitFor();
		      Process r = Runtime.getRuntime().exec("cmd.exe /c start TYPE c:\\temp\\rej01.reg > c:\\temp\\rej01.txt");
		      r.waitFor();

Wynikiem tego jest utworzenie pliku rejestru, przekopiowanie w odpowiednie miejsce ale natomiast przekonwertowanie już nie działa (zgłasza, że nie może odnaleźć określonego pliku). Gdy robię z palca bezpośrednio po wykonaniu programu wszystko jest ok.
Wydaje mi się, że chce on konwertować zanim plik się pojawi w odpowiednim miejscu.

Czy jest jakieś polecenie, które spowoduje to, że przy zakończeniu procesu np. p, proces p oznajmi, że zakończył działanie, przekaże to info do procesu q, ten uaktywni się, wykona polecenie, przekaże procesowi r, że zakończył działanie i uaktywni się proces r? Takie szeregowanie powiadamianie się :) p > q > r

dzięki wielkie za pomoc.
Pozdrawiam

0

Sam sobie odpowiem.
Można napisać polecenia w pliku .bat a potem tylko jego wykonać :)
Pozdrawiam

0

A po co wywołujesz naraz dwa lub nawet trzy procesy, z których tylko nad pierwszym masz kontrolę?
de facto odpalasz wyłącznie procesy z pliku cmd.exe, one z kolei odpalają kolejne - start jako kolejną kopię środowiska oraz właściwe polecenie. Na dodatek zależnie od tego czy są użyte rozszerzenia systemowe start powoduje wywołanie asynchroniczne. Pierwszy cmd może się zakończyć niezależnie od zakończenia cmd związanego z poleceniem start.

0
Olamagato napisał(a)

A po co wywołujesz naraz dwa lub nawet trzy procesy, z których tylko nad pierwszym masz kontrolę?
de facto odpalasz wyłącznie procesy z pliku cmd.exe, one z kolei odpalają kolejne - start jako kolejną kopię środowiska oraz właściwe polecenie. Na dodatek zależnie od tego czy są użyte rozszerzenia systemowe start powoduje wywołanie asynchroniczne. Pierwszy cmd może się zakończyć niezależnie od zakończenia cmd związanego z poleceniem start.

ok, rozumiem tylko nie wiem jak to zapisać.
Przy kodzie jaki podałem usunąłem "/c start" i nadal jest to samo.

dzięki za odpowiedź

0

Za dużo. Tylko start był niepotrzebny, opcja /c potrzebna. Polecenia wewnętrzne systemu nie istnieją samodzielnie jako pliki wykonywalne - robi to cmd.exe. Ale w sumie Twój problem rozwiązuje również plik bat, tak jak napisałeś. To jednak zadziała pod warunkiem, że przygotujesz go wcześniej lub będziesz mieć prawo do zapisu plików *.bat na bieżąco.

ps. Po co robisz type x.reg > y.txt z użyciem strumienia? To samo robi zwykłe copy x.reg y.txt. Używanie strumieni w cmd z opcją /c jest nie najlepszym pomysłem bo nad nim ma kontrolę jakiś podsystem (i od niego zależy, kiedy plik zostanie zamknięty), a także przy każdym wywołaniu cmd /c masz za każdym razem osobne środowisko z niezależnymi od siebie strumieniami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1