Jak uruchomić plik bat w tle z innego pliku bat?

92

Mam skrypt "instalacyjny", który uruchamiam rano i uruchamia wszystkie programy, których potrzebuję. Teraz niektóre z nich wymagają dodatkowej konfiguracji środowiska, więc muszę je opakować w małe skrypty BAT.

Jak uruchomić taki skrypt na Windows XP w tle?

CALL env-script.bat uruchamia go synchronicznie, tj. skrypt instalacyjny może być kontynuowany dopiero po zakończeniu działania polecenia w skrypcie env.

START/B env-script.bat uruchamia inne wystąpienie CMD.exe w tym samym wierszu polecenia, pozostawiając go w naprawdę niechlujnym stanie (widzę dane wyjściowe zagnieżdżonego CMD.exe, klawiatura przez chwilę nie działa, skrypt nie jest wykonywany).

START/B CMD env-script.batdaje ten sam wynik. Żadna z flag w CMD nie wydaje się pasować do mojego rachunku.

Aaron Digulla
źródło

Odpowiedzi:

72

Właściwie to działa dobrze dla mnie i tworzy nowe okna:

test.cmd:

@echo off
start test2.cmd
start test3.cmd
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

Połącz to z parametrami do start, takimi jak /min, jak zauważył Moshe, jeśli nie chcesz, aby nowe okna pojawiały się przed tobą.

Joey
źródło
1
W porządku, to działa, ale nie jest w 100% idealne: po naciśnięciu przycisku „RETURN” w „teście 2” to okno się nie zamyka. Jakieś pomysły?
Aaron Digulla,
Możesz dodać „wyjście” do utworzonych partii, aby później je ponownie zamknąć. Przepraszam, nie testowałem tak daleko :)
Joey
w rzeczywistości start script1.bat \ n start script2.bat \ n start scriptN.bat był dla mnie wystarczający
andrej
142

Dwa lata, ale dla kompletności ...

Standardowe podejście inline: (tj. Zachowanie, które można uzyskać podczas korzystania &z systemu Linux)

START /B CMD /C CALL "foo.bat" [args [...]]

Uwagi: 1. CALLjest sparowany z plikiem .bat, ponieważ to tam, gdzie zwykle się znajduje ... (tj. Jest to tylko rozszerzenie CMD /C CALL "foo.bat"formularza, aby był asynchroniczny. Zwykle jest to wymagane do poprawnego pobrania kodów zakończenia, ale to nie jest problem tutaj.); 2. Podwójne cudzysłowy wokół pliku .bat są potrzebne tylko wtedy, gdy nazwa zawiera spacje. (Nazwa może być ścieżką, w którym to przypadku istnieje większe prawdopodobieństwo).

Jeśli nie chcesz, aby wynik:

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

Jeśli chcesz, aby nietoperz działał na niezależnej konsoli: (np. W innym oknie)

START CMD /C CALL "foo.bat" [args [...]]

Jeśli chcesz, aby drugie okno wisiało później:

START CMD /K CALL "foo.bat" [args [...]]

Uwaga: W rzeczywistości jest to kiepska forma, chyba że masz użytkowników, którzy specjalnie chcą używać otwartego okna jako normalnej konsoli. Jeśli chcesz, aby okno pozostało w pobliżu, aby zobaczyć dane wyjściowe, lepiej umieścić znak PAUSEna końcu pliku bat. Lub jeszcze dodaj ^& PAUSEpo linii poleceń:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
antak
źródło
10
&jest operatorem „a następnie” (terminologia?). (np. cmd1 & cmd2oznacza wykonanie „cmd1”, a następnie „cmd2”. W przeciwieństwie do &&operatora, wykonanie „cmd2” nie zależy od pomyślnego zakończenia operacji „cmd1”). Znak ^ucieka, &więc trafia do argumentów CMD zamiast być zużyty i uruchamiany na tej samej konsoli, na której uruchomiono START.
antak
To jest bardzo pomocne, dzięki. Miałem właśnie zamiar przenieść niektóre skrypty na Linuksa, ponieważ inne przewodniki starti cmdnie dawały pełnej funkcjonalności, której szukałem. Twoja odpowiedź jest trafna.
Iterator
3
Jeśli nie chcesz danych wyjściowych, przekierowanie musi zostać zmienione, aby zostało przesłane do CMD. Również CALL nie jest potrzebne:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham
1
@dbenham: Chociaż to, co mówisz, ma sens, START /B "" CMD /C PING 127.0.0.1 >NULwydaje się działać niezależnie od tego i nic nie jest wyświetlane. (Prawdopodobnie dlatego, że CMDdziedziczy STARTuchwyty I / O). Wydaje mi się, że różnica polega na tym, że chcesz zachować START(błąd) wyjście nienaruszone, co jest prawdopodobnie dobrym pomysłem. CALLjest tam tylko dlatego, że uważam, że warto zachować tę praktykę. (tj. nieużywanie CALLdo synchronicznych wywołań nietoperzy spowoduje nieprzewidywalne kody wyjścia, więc konsekwentnie paruję wywołania nietoperzy, CALLnawet jeśli nie ma to ścisłego zastosowania, jak w tym przypadku.)
antak
7

Ponieważ START to jedyny sposób na wykonanie czegoś w tle ze skryptu CMD, radziłbym nadal go używać. Zamiast modyfikatora / B wypróbuj / MIN, aby nowo utworzone okno nie przeszkadzało. Możesz także ustawić priorytet na niższy za pomocą / LOW lub / BELOWNORMAL, co powinno poprawić szybkość reakcji systemu.

Mosze
źródło
-1 Problem polega na tym, że START nie tworzy nowego okna po uruchomieniu pliku BAT; zamiast tego ponownie wykorzystuje bieżące okno i miesza we / wy dwa procesy CMD.
Aaron Digulla
4
Nie tworzy nowego okna, ponieważ używasz flagi / B. Usunąć to.
Moshe
5

Termin inny niż termin pierwszoplanowy / istniejący. Innym sposobem na ukrycie uruchomionego okna jest użycie vbscript, jeśli jest ono nadal dostępne w twoim systemie.

DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

nazwij go jako sth.vbs i wywołaj go z nietoperza, włóż zaplanowane zadanie itp. Osobiście wyłączę vbs bez pośpiechu w każdym systemie Windows, którym zarządzam :)

Mea culpa
źródło
W moim konkretnym przypadku było to właściwie jedyne rozwiązanie, jakie mogłem dostać do pracy ...
Ben,
0

Utwórz nową aplikację C # Windows i wywołaj tę metodę z main:

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}
LegendLength
źródło
2
Uhm ... miałem nadzieję, że coś tak prostego jak że nie wymaga instalacji Visual Studio ...
Aaron Digulla
1
Dopóki PowerShell nie będzie dostępny w 100% - C # to naprawdę przesada.
jim
2
Aaron: Kompilator C # jest zawarty w .NET Framework 2, więc możesz po prostu edytować kod w edytorze tekstu i skompilować go. Mimo to, ponieważ jest to całkowicie możliwe w pliku wsadowym, powiedziałbym również, że C # to przesada.
Joey
0

Działa to w przypadku mojej instalacji systemu Windows XP Home w systemie Unix:

call notepad.exe & 
MiiToo
źródło
7
Myślę, że to działa tylko przez przypadek, a & nie jest konieczne.
Sam Watkins,
2
Tak, program notepad.exe jest na początku asynchroniczny.
antak
0

Właściwie jest to dość łatwe z tą opcją na końcu:

c: \ start BATCH.bat -WindowStyle Hidden

user8832474
źródło
polecenie systemu Windows startnie ma -WindowStyleopcji.
Stephan
@Stephan Arreed. C:` instead of Dziwna ścieżka ( C: \ Windows`) sugeruje, że znalazł narzędzie gdzieś w Internecie i skopiował je na swój dysk twardy.
Aaron Digulla