uruchamianie .bat pod windowsem

uruchamianie .bat pod windowsem
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Witam, chciałbym z poziomu PHP uruchomić skrypt .bat oraz uzyskać PID procesu, aby mieć możliwość późniejszego zamknięcia tego programu.
Czytałem o exec ale w manualu nie ma nic o PID, a do tego wszystkie przykłady w internecie są pod linuxa

Patryk27
Pomijając, że plik .bat sam w sobie nie jest programem, to po co w ogóle musisz taki plik uruchamiać? \o/
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Ostatecznie mogę skopiować zawartość pliku bat, jednak jak to uruchomić bez czekania na koniec działania aplikacji + uzyskać PID

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 3 godziny
2

Skomplikowane dość, ale wykonalne.
exec() powoduje, że PHP wisi oczekując na zakończenie aplikacji. Aby uruchomić w tle możesz użyć w Linuksie &, a w Windows np. start.exe.
Potem możesz użyć np. tasklist.exe do uzyskania listy aktualnych procesów i ich PID (między innymi) - tasklist jest dostępny bodaj od Windows XP SP2, więc już dawno. Na tym, co zwraca tasklist szukasz PID przypisanego do cmd.exe (bo to interpreter plików BAT).

Zamknięcie na podstawie PID może załatwić aplikacja taskkill: taskkill.exe /PID 1234.

CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

jest tu jeszcze jeden problem, może się zdarzyc tak że będą działać 3 takie same programy jednak z innymi parametrami.

o ile w linuxie samo exec zwraca pid, to w windowsie przeszukiwanie tasklist - ale skoro działają 2 inne to jak moge znaleźć ten 3. dodam że nie jest to jedna strona ktora nimi zarzadza

edytowany 2x, ostatnio: carkar
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 3 godziny
1

Pomysł na szybko:

start.exe pozwala na sprecyzowanie nazwy okna, z którym będzie wywoływana aplikacja, np. start.exe foobar cmd.exe. Z kolei tasklist pozwala filtrować po nazwie okna, np. tasklist.exe /FI "WINDOWTITLE eq foobar". Uruchamiaj każdy z losowym identyfikatorem jako nazwą okna, a znajdziesz PID tego, o który chodzi.

Pomysł nieco na około, ale chyba lepszy:
Użyj psexec z pakietu PsTools z Sysinternals. Potrafi zwrócić PID utworzonego procesu (co prawda w formie tekstowej, ale da się sparsować) i od razu kończyć swoje działanie.

Kopiuj
C:\Users\Marcin>psexec -d cmd.exe

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

cmd.exe started with process ID 5376.

C:\Users\Marcin>

http://forum.sysinternals.com/psexec-pids-php-and-hidden-windows_topic12108.html

CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Pojawił się następny problem..

Kopiuj
$command = "cd \"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\"";
$command .= "\r\n";
$command .= "\"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\PsExec.exe\" -d \"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\serverstart.bat\"";

No cóż, chciałbym aby najpierw użyć CD a następnie od razu dalszą cześć uruchamiającą serwer.
Niestety znaki \r\n nie są obsługiwane przez cmd

RE
Jeszcze ludzie w Jedi Knight grają? Z dobre 6 lat temu administrowałem jednym z prywatnych serwerów JK:JA, na którym graliśmy odprężające TDMy z graczami z polskiej czołówki ESL. Moim przywilejem było dostawanie od nich batów :P.
Demonical Monk
  • Rejestracja:ponad 17 lat
  • Ostatnio:11 miesięcy
1

Jak to nie są? Są! Tylko to nie jest konsola :|
Obstawiam, że nie istnieje nawet w tym kontekście polecenie 'cd'.

Zmień bieżący katalog w ten sposób: http://www.php.net/manual/pl/function.chdir.php
Później wykonaj po prostu "serverstart.bat".

Z drugiej strony przekombinowałeś - po cholerę w ogóle robić cd lub chdir skoro używasz ścieżek absolutnych?


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 4x, ostatnio: Demonical Monk
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Gdyż taki jest początek bata: .\jampded +set BLAH BLAH
Gdy nie ma najpierw CD, program za ścieżkę z której wszystko wykonuje uznaje: C:/windows/administartor, a ja chcę aby to bylo: C:\Program Files (x86)\LucasArts\Star Wars Jedi Knight Jedi Academy\GameData

Demonical Monk
  • Rejestracja:ponad 17 lat
  • Ostatnio:11 miesięcy
1

Dorzuć na pocżatek bata:
cd C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\
I będziesz miał pewność, że katalog roboczy będzie w porządku.


Women were the reason I became a monk - and, ah, the reason I switched back...
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

No cóż gdy wpisuje w konsoli to co mam w skrypcie, wszystko działa dobrze.
A gdy z PHP: Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\RotFpanel\test.php on line 4
W linii 4 jest własnie EXEC polecenia

Demonical Monk
  • Rejestracja:ponad 17 lat
  • Ostatnio:11 miesięcy
0

Bo nie robisz tego asynchronicznie.


Women were the reason I became a monk - and, ah, the reason I switched back...
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Wystarczyło dodać /accepteula do linii poleceń PsExec-a,
echo(exec($command));
nie wyświetla żadnego wyniku :/, pomimo że na serwerze wszystko wykonuje się poprawnie

edytowany 1x, ostatnio: carkar
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 3 godziny
1

Funkcja exec() nie zwraca całego wyjścia konsoli. Manual do PHP mówi:

Return Values
The last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

To get the output of the executed command, be sure to set and use the output parameter.

Użyj trzeciego parametru dla exec, wyjście zostanie zapisane do tablicy wyjściowej (użyj referencji!).

I fakt, EULA wyskakuje przy pierwszym uruchomieniu, ale kompletnie na to bym nie wpadł ;-)

edytowany 3x, ostatnio: Ktos
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Dodałem:

Kopiuj
-i  2>&1'

Ale to zwraca mi PID CMD.exe a nie jampded.exe

unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
1

bo uruchamiając skrypt odpalasz cmd a on dopiero uruchamia podprogramy
ale jak zabijesz te cmd to najprawdopodobniej pójdzie spać razem ze swoimi dziećmi więc nie powinno ci to przeszkadzać

inna sprawa - czemu uruchamiasz skrypt bat a nie przepiszesz go na php?


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 1x, ostatnio: unikalna_nazwa
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Zabicie cmd, nie powoduje zabicia konsoli jampded.exe
Nie przepisze, gdyż w bacie są 2 linijki(jedna z tych poleceń to CD)

edytowany 1x, ostatnio: carkar
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
1
carkar napisał(a)

Zabicie cmd, nie powoduje zabicia konsoli jampded.exe
Nie przepisze, gdyż w bacie są 2 linijki(jedna z tych poleceń to CD)

no to skoro są tylko 2 linijki to tym prościej przepisać je na php - nie rozumiem Twojego podejścia :/
odpowiednik cd w php to chdir()
albo jeszcze lepiej - cd możesz zastąpić przełącznikiem -w w psexec

żeby zabić cmd z potomkami użyj przełącznika /T w taskkill


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa
CA
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:19
0

Dzięki wielkie wszystkim ;)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)