Windows XP lub nowszy Windows: Jak uruchomić plik wsadowy w tle bez wyświetlania żadnego okna?

121

Wiem, że już odpowiedziałem na podobne pytanie ( uruchamianie pliku wsadowego w tle podczas uruchamiania systemu Windows ), ale tym razem muszę uruchomić plik wsadowy:

  • z innej partii,
  • bez wyświetlania żadnego okna konsoli,
  • ze wszystkimi argumentami przekazanymi do niewidocznej wiązki.

Pierwsza partia jest wykonywana w oknie konsoli. Jednak nie chcę, aby druga partia (uruchamiana przez pierwszą w sposób asynchroniczny ) również wyświetlała okno konsoli.

Wymyśliłem skrypt VBScript, który właśnie to robi i umieściłem skrypt jako odpowiedź, do której inni mogą się odwoływać , ale jeśli masz inne pomysły / rozwiązania, nie krępuj się.

Uwaga: Wiele osób nazywa okno konsoli procesora poleceń systemu Windows jako niepoprawne okno DOS.


Dziękuję wszystkim za odpowiedzi. Z tego co rozumiem, jeśli potrzebuję asynchronicznie wywołać skrypt do uruchomienia w trybie niewidocznym:

  • Z drugiego skryptu już w oknie konsoli, start /bwystarczy.
  • Z systemu Windows, bez uruchamiania drugiego okna , moje rozwiązanie jest nadal aktualne.
VonC
źródło
Uruchamiasz plik wsadowy z INNEGO pliku wsadowego? Czy ten już uruchomiony plik wsadowy ma okno?
Dziwne myślenie
Tak, ta druga (pierwsza) partia jest wykonywana w oknach DOS. Jednak nie chcę, aby druga partia (uruchomiona przez pierwszą w sposób asynchroniczny) wyświetlała również okna (co by się stało z poleceniem
``

Odpowiedzi:

53

Czy potrzebujesz drugiego pliku wsadowego do asynchronicznego działania? Zwykle jeden plik wsadowy jest uruchamiany synchronicznie z callpoleceniem, a drugi współużytkuje pierwsze okno.

Państwo może używać start /b second.bat do uruchomienia drugiego pliku wsadowego synchronicznie z Twoja pierwsza że akcja Twojego Pierwszym z nich jest okno. Jeśli oba pliki wsadowe zapisują się na konsoli jednocześnie, dane wyjściowe będą się nakładać i prawdopodobnie nie będzie można ich odczytać. Ponadto będziesz chciał umieścić polecenie na końcu drugiego pliku wsadowego lub będziesz w drugiej powłoce, gdy wszystko zostanie wykonane.exitcmd

P tato
źródło
1
Poprawny. Wierzyłem, że start / b otworzy nowe okna, ale jeśli zostanie wykonany z okna DOS, będzie współdzielił te same okna.
VonC
110

Oto możliwe rozwiązanie:

Z pierwszego skryptu wywołaj drugi skrypt za pomocą następującego wiersza:

wscript.exe invis.vbs run.bat %*

Właściwie to wywołujesz skrypt VBS z:

  • [ścieżka] \ nazwa skryptu
  • wszystkie inne argumenty wymagane przez twój skrypt ( %*)

Następnie invis.vbs wywoła skrypt za pomocą metody Windows Script Host Run () , która pobiera:

  • intWindowStyle: 0 oznacza „niewidoczne okna”
  • bWaitOnReturn: false oznacza, że ​​twój pierwszy skrypt nie musi czekać na zakończenie drugiego skryptu

Oto invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False
VonC
źródło
3
2k wyświetleń i co za świetny post + odpowiedź, więcej osób powinno głosować w tym wątku
Ric Tokyo
Świetne rozwiązanie, dokładnie to, czego potrzebowałem.
nikhil
Jedynym problemem jest to, że tworzy to proces o nazwie „cmd.exe”, który będzie trudny do znalezienia w przyszłości.
Aditya Gupta
12

Przekonwertuj plik wsadowy na exe. Wypróbuj Bat To Exe Converter lub Online Bat To Exe Converter i wybierz opcję uruchomienia go jako aplikacji-widma, tj. Bez okna.

Rob Kam
źródło
3
Możliwe, ale w tym przypadku postaram się uniknąć dodatkowego kroku.
VonC
21
Zwykle nie jestem aż tak paranoikiem, ale czy nie byłoby głupio pozwolić komuś anonimowemu wygenerować dla mnie ten plik exe? Można wstrzykiwać wszelkiego rodzaju złośliwe rzeczy.
Tobias,
9

Myślę, że jest to najłatwiejsze i najkrótsze rozwiązanie do uruchomienia pliku wsadowego bez otwierania okna DOS, może to być bardzo rozpraszające, gdy chcesz zaplanować okresowe uruchamianie zestawu poleceń, więc okno DOS ciągle się pojawia, oto twoje rozwiązanie . Użyj skryptu VBS, aby wywołać plik wsadowy ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

Skopiuj powyższe wiersze do edytora i zapisz plik z rozszerzeniem .VBS. Zmień odpowiednio nazwę i ścieżkę pliku .BAT.

indago
źródło
1
Ciekawe podejście, na pewno krótsze niż moje rozwiązanie. +1
VonC,
Świetne rozwiązanie. Czytając to zauważyłem, że tak naprawdę nie ma potrzeby używania Set WshShell = Nothing, działało dobrze dla mnie i możesz mieć jeszcze mniejszy sposób, aby to zrobić.
Patrick Bard
7

Oto moja kolekcja sposobów, aby to osiągnąć - a nawet więcej - tam, gdzie było to możliwe, próbowałem zwrócić również PID uruchomionego procesu (wszystkie połączone skrypty można pobrać i zapisać pod dowolną nazwą, którą uznasz za dogodną):

1) Rozwiązanie IEXPRESS może być używane nawet na starych maszynach z systemem Windows 95/98. Iexpress to naprawdę starożytne narzędzie, które wciąż jest dostarczane z systemem Windows - jako argumenty akceptuje tylko polecenie i jego argumenty.

Przykładowe użycie:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - ponownie przyjmuje tylko dwa argumenty - polecenie i argumenty, sprawdza również, czy zostało uruchomione z podwyższonymi uprawnieniami i jeśli to możliwe, pobiera PID procesu z WEVTUTILEM (dostępne od Visty i wyższych, więc nowsza wersja systemu Windows otrzyma PID).

Przykładowe użycie:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) `` WScript.Shell '' - skrypt jest pełnym opakowaniem `` WScript.Shell '' i każdą możliwą opcję można ustawić za pomocą opcji wiersza poleceń.Jest to hybryda jscript / batch i można go nazwać nietoperzem.

Przykładowe użycie (aby uzyskać więcej informacji, wypisz pomoc z '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) `` Win32_ProcessStartup '' - ponownie pełne opakowanie i wszystkie opcje są dostępne za pośrednictwem argumentów wiersza poleceń, tym razem jest to hybryda WSF / batch z niektórymi fragmentami kodu Jscript i VBScript - ale zwraca PID uruchomionego procesu. nie ukryte, można użyć niektórych opcji, takich jak współrzędne X / Y (nie dotyczy to każdego pliku wykonywalnego - ale na przykład cmd.exe akceptuje współrzędne).

Przykładowe użycie (aby uzyskać więcej informacji, wypisz pomoc z '-h'):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5). Rozwiązanie .NET . Większość opcji opcji ProcessStartInfo jest wykorzystywana (ale na koniec byłem zbyt zmęczony, aby wszystko zawrzeć):

Przykładowe użycie (aby uzyskać więcej informacji, wypisz pomoc z '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
npocmaka
źródło
2

W drugim pytaniu zasugerowałem autoexnt . Jest to również możliwe w tej sytuacji. Po prostu ustaw usługę tak, aby była uruchamiana ręcznie (tj. Nie automatycznie podczas uruchamiania). Jeśli chcesz uruchomić wsad, zmodyfikuj plik autoexnt.bat, aby wywołać żądany plik wsadowy, i uruchom usługę autoexnt.

Plik wsadowy do rozpoczęcia tego może wyglądać następująco (nieprzetestowany):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

Zwróć uwagę, że pliki wsadowe uruchomione w ten sposób działają jako użytkownik systemu, co oznacza, że ​​nie masz automatycznego dostępu do udziałów sieciowych. Ale możesz użyć funkcji net use, aby połączyć się ze zdalnym serwerem.

Trzeba pobrać Windows 2003 Resource Kit , aby je zdobyć. Zestaw Resource Kit można również zainstalować w innych wersjach systemu Windows, takich jak Windows XP.

wimh
źródło
1
Ciekawe, ale jak na ten scenariusz mocno przesada.
VonC
2

Uruchom go pod inną nazwą użytkownika, używając „runas” lub planując dla innego użytkownika w Zaplanowanych zadaniach systemu Windows.

JosephStyons
źródło
Możliwe, ale nie dokładnie to, czego szukam (bezpośrednie połączenie asynchroniczne w tle)
VonC
0

Możesz uruchomić plik .bat za pośrednictwem pliku .vbs.
Skopiuj następujący kod do pliku .vbs:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 
Vinod Chelladurai
źródło
0

Możesz także użyć

start /MIN notepad.exe

PS: Niestety, stan zminimalizowanego okna zależy od polecenia do uruchomienia. VG nie działa

start /MIN calc.exe
user2928048
źródło