Uruchom plik .bat w zaplanowanym zadaniu bez okna

143

Mam zaplanowane zadanie, które uruchamia skrypt wsadowy uruchamiany robocopyco godzinę. Za każdym razem, gdy się uruchamia, na pulpicie pojawia się okno z wyjściem robocopy, czego tak naprawdę nie chcę widzieć.

Udało mi się zminimalizować okno, uruchamiając zaplanowane zadanie

cmd /c start /min mybat.bat

ale to daje mi nowe okno poleceń co godzinę. Byłem tym zaskoczony, biorąc pod uwagę: cmd /c„Wykonuje polecenie określone przez ciąg znaków, a następnie kończy działanie” - musiałem źle zrozumieć dokumenty.

Czy istnieje sposób na uruchomienie skryptu wsadowego bez wyskakiwania okna cmd?

Tom Dunham
źródło
Uważam, że jest to bardziej preferowana odpowiedź stackoverflow.com/questions/6568736/...
Efekt

Odpowiedzi:

144

Zamiast tego możesz uruchomić go w trybie cichym, używając pliku skryptu systemu Windows. Metoda Run pozwala na uruchomienie skryptu w trybie niewidocznym. Utwórz .vbsplik taki jak ten

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

i zaplanuj to. Drugi argument w tym przykładzie ustawia styl okna. 0 oznacza „ukryj okno”.

Pełna składnia metody Run :

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Argumenty:

  • obiekt: obiekt WshShell.
  • strCommand: wartość ciągu wskazująca wiersz poleceń, który chcesz uruchomić. Musisz dołączyć parametry, które chcesz przekazać do pliku wykonywalnego.
  • intWindowStyle: opcjonalnie. Wartość całkowita wskazująca wygląd okna programu. Pamiętaj, że nie wszystkie programy korzystają z tych informacji.
  • bWaitOnReturn: opcjonalnie. Wartość logiczna wskazująca, czy skrypt powinien czekać na zakończenie wykonywania programu, zanim przejdzie do następnej instrukcji w skrypcie. Jeśli ustawiona na wartość true, wykonywanie skryptu zatrzymuje się, aż program się zakończy, a polecenie Run zwraca kod błędu zwrócony przez program. Jeśli ustawione na false (domyślnie), metoda Run zwraca natychmiast po uruchomieniu programu, automatycznie zwracając 0 (nie należy interpretować tego jako kod błędu).
splattne
źródło
+1, właśnie napisałem dokładnie to samo
Sam Cogan
Widziałem to przed usunięciem. Chyba oboje jesteśmy botami. ;-)
splattne
1
nazwa użytkownika, szczerze myślę, że Sam zasługuje na to bardziej niż ja. Ale i tak dziękuję! I nie wspominaj o mnie i Jonie Skeet w tym samym zdaniu. To bluźnierstwo! ;-)
splattne
3
Na pytanie „Czy istnieje sposób na uruchomienie skryptu wsadowego bez wyskakiwania okna cmd?”, Daje bardzo bezpośrednią odpowiedź: Uruchom go przy użyciu pliku skryptu Windows.
Mark Meuer,
2
@Lee Myślę, że podwójne cudzysłowy są konieczne, jeśli ścieżka zawiera spacje.
splattne
58

Czy wykonujesz to jako zaplanowane zadanie? Jeśli tak, ustaw go tak, aby działał jako inne konto użytkownika, wtedy nie będzie widoczny dla zalogowanego użytkownika. Jeśli skrypt nie potrzebuje dostępu do sieci do elementów wymagających uwierzytelniania systemu Windows (takich jak udziały plików lub drukarki), możesz go uruchomić jako „nt organ \ system” i pozostawić hasło puste. W systemie Windows 7 po prostu ustaw użytkownika na SYSTEM i naciśnij OK.

(Prawdopodobnie musisz użyć prawdziwego użytkownika, jeśli używasz robocopy ...)

JR

John Rennie
źródło
3
Dzięki - to było dla mnie mniej kłopotów niż opcja .vbs.
mackenir
8
Ustawiłem użytkownika „Uruchom jako” na SYSTEM (który później zmienił o NT AUTHORITY \ SYSTEM) i zadziałało dla mnie. Nie widzę już wyskakującego okna CMD po uruchomieniu mojego zaplanowanego zadania. Dzięki!
Ryan Stille,
1
+1, to jest eleganckie. Pamiętaj, aby wpisać „system” jako nazwę użytkownika, a następnie win7 zrobi za ciebie resztę. Pamiętaj, że NIE masz dostępu do sieci do Internetu, po prostu nie do udziałów sieciowych i rzeczy wymagających uwierzytelniania systemu Windows.
samsmith
1
Użytkownik systemu jest prosty i elegancki, świetna WSKAZÓWKA! +1!
Matteo Conta
1
Zobacz Wdrażanie modeli administracyjnych o najmniejszych uprawnieniach . Czy korzystanie z konta System w tym celu narusza zasady najmniejszych uprawnień? Jeśli tak, to administratorzy powinni wiedzieć, że nie powinni tego robić w większości sytuacji.
user34660
29

Po prostu skonfiguruj Zaplanowane zadanie jako „Uruchom bez względu na to, czy użytkownik jest zalogowany”.

Peter Meinl
źródło
6
Doskonały! Możesz nawet wyłączyć przechowywanie poświadczeń, a wtedy będzie to bezpieczniejsze niż uruchamianie go przez SYSTEM!
binki,
17

Możesz także spróbować CHP (Utwórz ukryty proces) , robi dokładnie to, co myślisz ...

CHP.EXE mybat.bat

Działa bez okna poleceń. Doskonały! Wykonane przez te same osoby co CMDOW, ale jest to bardziej odpowiednie.

Rocketmonkeys
źródło
Działa idealnie, gdy trzeba uruchomić zadanie w kontekście zalogowanego użytkownika („Trigger: podczas łączenia z sesją użytkownika”, „Uruchom zadanie jako: Użytkownicy”)
Siergiej
1
to nie jest wbudowane narzędzie
JonnyRaa
9

CMDOW to niesamowite narzędzie, które pozwala wykonywać wiele, wiele rzeczy do okien z poziomu wiersza poleceń.

Jedną z najprostszych rzeczy jest ukrycie bieżącego okna (zwykle jako pierwszej linii w pliku nietoperza) za pomocą:

cmdow @ /hid

lub rozpocznij nowy ukryty proces za pomocą

cmdow /run /hid mybat.bat 
itsadok
źródło
4
Zarówno ta, jak i sugestia Rocketmonkeys obejmują pobieranie nowych narzędzi, co oznacza większą kompatybilność na różnych komputerach. Upieczone, za pomocą poleceń systemu Windows jest znacznie lepsze.
IanVaughan
Plus cmdow jest wykrywany jako „niebezpieczne” przez niektóre programy antywirusowe (to nie niebezpieczne, ale sama detekcja może powodować pewne problemy, jeśli plik cmdow jest kwarantannie ...).
Otiel,
3
wciąż jest wyskakująca konsola, po prostu flashuj bardzo szybko.
Bambus
5

Spróbuj wywołać skrypt za pomocą

start /b <command>

źródło
1
To nie działa, Zaplanowane Zadanie-> Status stwierdza „Nie można uruchomić”, to znaczy: start / b C: \ file.bat: i: start / b „C: \ file.bat”: ale: C: \ plik.bat: działa dobrze.
IanVaughan
1
Ponieważ startnie jest programem, jest to polecenie. Musisz określić cmdjako program do uruchomienia i /c start /b <file>jako argument. Jednak to nadal nie zadziała, ponieważ nadal utworzy okno konsoli cmdi flashuje czarne okno na ekranie.
Synetech,
1
Może również potwierdzić za pomocą @Synetech, że nie spowoduje to utworzenia nowego okna, ale nadal musisz mieć otwarte okno konsoli, aby je uruchomić. Jest to rzeczywiście przydatne polecenie, ale nie można go używać zgodnie z żądaniami w przypadku Zaplanowanych zadań.
JonathanDavidArndt
5

Możesz utworzyć skrót do pliku wsadowego, ustawić skrót, aby zaczął być zminimalizowany (we właściwościach skrótu, karta „Skrót”), a następnie ustawić zadanie, aby rozpocząć skrót.

Ważne : musisz ręcznie określić ścieżkę do skrótu, wpisując go w polu tekstowym Uruchom wraz z rozszerzeniem „.lnk”; jeśli po prostu spróbujesz do niego przejść, pomocne będzie przekierowanie do tego, na co wskazuje skrót.

Doug Kavendek
źródło
To nie działa w systemie Windows 10 x64, daje to wyskakujące okienko „Jak chcesz otworzyć ten plik?”
stycznia
1

Zdaję sobie sprawę, że na to pytanie już udzielono odpowiedzi w doskonałej rozdzielczości, która jest natywna dla systemu Windows i dlatego powinna być jak najbardziej kompatybilna, i zgadzam się całkowicie.

Chciałem również powiedzieć, że nie zgadzam się z komentarzem @ splattne (ale nie z jego faktyczną odpowiedzią) - że rezolucja w innym odnośnym wątku zasługuje na uznanie. Ta odpowiedź polega na uruchomieniu skryptu jako innego użytkownika (SYSTEM), co jest prawie równoważne z udzieleniem skryptu dostępu do katalogu głównego. Nie powiedzie się również w przypadku zadań takich jak ROBOCOPY(o których wspomina John Rennie), które wymagają dostępu do sieci.

Nigdy wcześniej nie próbowałem CMDOW, ale chciałbym zaoferować inną podobną rozdzielczość, która [chociaż nie jest instalowana natywnie w systemie Windows] jest nadal wysoce przenośna dla większości wersji i jest dostępna zarówno w wersjach 32-bitowych, jak i 64-bitowych, i to jest NirCmd .

NirCmd to bardzo potężne narzędzie, które ma mnóstwo opcji, z których najbardziej użyteczną, osobiście uważam, że jest w stanie uruchomić ukryte okna poleceń, wykonując po prostu następujące czynności:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

Z execsekcji Opis poleceń NirCmd :

exec [show/hide/min/max] [application + command-line]

Uruchamia aplikację i opcjonalnie określa jeden lub więcej parametrów wiersza polecenia dla wykonanej aplikacji. Parametr [pokaż / ukryj / min / maks.] Określa, czy uruchomiona aplikacja będzie widoczna, czy nie. Jeśli określono opcję „ukryj”, uruchomiona aplikacja nie będzie widoczna dla użytkownika. Jeśli podano „maks.”, Okno uruchomionej aplikacji zostanie zmaksymalizowane. Jeśli podano „min”, okno uruchomionej aplikacji zostanie zminimalizowane.

EDYCJA: Próbowałem uruchomić ROBOCOPYzadanie i wypróbowałem metodę z tej odpowiedzi, i to nie zadziałało, nawet po edycji uprawnień dostępu do sieci. Próbowałem dwukrotnie kliknąć skrypt i nie mogłem go uruchomić, ale mogłem go uruchomić tylko z poziomu wiersza polecenia z podwyższonym poziomem uprawnień. Utworzyłem skrót do pliku wsadowego i uruchomiłem go jako Administrator i mogłem go uruchomić, klikając go dwukrotnie, ale metodą, którą skończyłem, było uruchomienie go ukrytego jako SYSTEM (wiem, wiem) - ale działa z tym ROBOCOPY, co jest warte, o ile plik wsadowy ma odpowiednie uprawnienia.

EDYCJA 2: Z jakiegoś powodu nie działałoby to jako SYSTEM (prawdopodobnie wspomniano wcześniej o dostępie do sieci) - zauważyłem to dopiero po uruchomieniu ROBOCOPYbez flagi / L, co jest w zasadzie tylko symulacją i [najwyraźniej] nie działa faktycznie łączę się ze zdalnym systemem, ale kiedy uruchamiam plik wsadowy z najwyższymi uprawnieniami i zaznaczam ukryte pole, i nadal mogę uruchomić go jako zalogowany użytkownik w tle bez okna poleceń, bez względu na to, co jest to warte dla każdego .

rubinorails
źródło
-2

Spróbuj wprowadzić polecenie zakończenia na końcu pliku wsadowego. Powinno to zamknąć okno poleceń po zakończeniu skryptu.

Brian S. Wilson
źródło
-2

Aby ukryć dane wyjściowe (choć nie okno), dodaj to na początku pliku wsadowego:

@echo off
voidstate
źródło