Jak mogę sprawdzić, czy aplikacja działa z pliku wsadowego (dobrze cmd)?
Nie muszę uruchamiać innej instancji, jeśli program jest już uruchomiony. (Nie mogę zmienić aplikacji tak, aby była pojedynczą instancją).
Aplikacja może również działać jak każdy użytkownik.
windows
command-line
batch-file
Matt Lacey
źródło
źródło
Odpowiedzi:
Inną możliwością, którą wymyśliłem, zainspirowaną użyciem grep , jest:
Nie musi zapisywać dodatkowego pliku, więc wolę tę metodę.
źródło
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/if %ERRORLEVEL%==1 goto wordnotrunning
, aby działał (podejrzewając cytat wokół części if/?
ekranie pomocy . Na przykładIMAGENAME
w polskiej wersji jestNAZWA_OBRAZU
.tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
Pierwszy NUL wydaje się niepotrzebny, nie mam pojęcia do czego służy „2”, / NH jest opcjonalne.Oto jak to wypracowałem:
Powyższe spowoduje otwarcie Notatnika, jeśli jeszcze nie jest uruchomiony.
Edycja: Pamiętaj, że nie znajdzie to aplikacji ukrytych przed listą zadań. Obejmie to wszelkie zaplanowane zadania uruchomione jako inny użytkownik, ponieważ są one automatycznie ukryte.
źródło
Podoba mi się rozwiązanie Chaosmaster! Ale szukałem rozwiązania, które nie uruchamia inny program zewnętrzny (jak Find.exe lub Findstr.exe ). Dodałem więc pomysł z rozwiązania Matta Laceya, który tworzy również plik tymczasowy, którego można uniknąć. Na koniec mogłem znaleźć dość proste rozwiązanie, więc dzielę się nim ...
To mi ładnie działa ...
źródło
Sugestia npocmaka, aby użyć QPROCESS zamiast TASKLIST, jest świetna, ale jej odpowiedź jest tak duża i złożona, że czuję się zobowiązany do opublikowania dość uproszczonej wersji, która, jak sądzę, rozwiąże problem większości nie zaawansowanych użytkowników:
Powyższy kod został przetestowany w systemie Windows 7 z użytkownikiem z uprawnieniami administratora.
źródło
W systemie Windows można użyć Instrumentacji zarządzania Windows (WMI), aby upewnić się, że nie zostaną uruchomione żadne aplikacje z określonym wierszem poleceń, na przykład:
wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)
źródło
Only the administrator group members can use WMIC.EXE.
następnieReason:Win32 Error: Access is denied.
źródło
/i
.Używam PV.exe z http://www.teamcti.com/pview/prcview.htm zainstalowanego w Program Files \ PV z plikiem wsadowym takim jak ten:
źródło
Odpowiedź TrueY wydawała się najbardziej eleganckim rozwiązaniem, musiałem jednak trochę popsuć, ponieważ nie rozumiałem, co się właściwie dzieje. Pozwólcie, że wyjaśnię wszystko, aby, mam nadzieję, zaoszczędzić trochę czasu dla następnej osoby.
Zmodyfikowana odpowiedź TrueY:
W każdym razie mam nadzieję, że to pomoże. Wiem, że czasami czytanie partii / wiersza poleceń może być mylące, jeśli jesteś rodzajem początkującym, takim jak ja.
źródło
Odpowiedź udzielana przez Matt Lacey działa na systemie Windows XP. Jednak w Windows Server 2003 linia
zwroty
który jest następnie odczytywany podczas działania procesu.
Nie mam zbyt wielu doświadczeń ze skryptami wsadowymi, więc moją duszą jest wyszukiwanie nazwy procesu w
search.log
pliku i pompowanie wyników do innego pliku i wyszukiwanie dowolnego wyniku.Mam nadzieję, że to pomaga komuś innemu.
źródło
Lubię narzędzia
WMIC
iTASKLIST
, ale nie są one dostępne w domowych / podstawowych edycjach systemuQPROCESS
Windows. Innym sposobem jest użycie polecenia dostępnego na prawie każdym komputerze z systemem Windows (dla tych, które mają usługi terminalowe - myślę, że wygrywam tylko XP bez SP2, więc praktycznie każdy maszyna z systemem Windows):QPROCESS
polecenie nie ma tak dużej mocyTASKLIST
i jest ograniczone do wyświetlania tylko 12 symboli nazwy procesu, ale należy je wziąć pod uwagę, jeśliTASKLIST
nie jest dostępne.Prostsze użycie, gdy używa nazwy, jeśli proces jest argumentem (
.exe
sufiks jest obowiązkowy w tym przypadku, gdy przekazujesz nazwę pliku wykonywalnego):Różnica między dwoma sposobami
QPROCESS
użycia polega na tym, żeQPROCESS *
wyświetla listę wszystkich procesów, aQPROCESS some.exe
filtruje tylko procesy dla bieżącego użytkownika.Używanie
WMI
obiektów przez exe hosta skryptu Windows zamiastWMIC
jest również opcją. Powinien on działać również na każdym komputerze z systemem Windows (z wyjątkiem tych, w których WSH jest wyłączony, ale jest to rzadki przypadek). Oto plik nietoperzy, który zawiera listę wszystkich procesów za pośrednictwem WMI klas i mogą być używane zamiastQPROCESS
w powyższym skrypcie (jest to hybryda jscript / bat i powinna zostać zapisana jako.bat
):I modyfikacja, która sprawdzi, czy proces jest uruchomiony:
Dwie opcje mogą być używane na komputerach, które nie mają
TASKLIST
.Wykorzystuje się najlepszą technikę
MSHTA
. Działa to na każdym komputerze z systemem Windows od XP i nowszych i nie zależy od ustawień hosta skryptu Windows. wywołanieMSHTA
może nieco obniżyć wydajność (ponownie należy zapisać jako nietoperz):źródło
Nie wiem, jak to zrobić z wbudowanym CMD, ale jeśli masz grep , możesz spróbować:
źródło
Wystarczy wspomnieć, że jeśli nazwa zadania jest naprawdę długa, to wynik nie pojawi się w całości
tasklist
, więc może być bezpieczniej (poza lokalizacją) sprawdzić, czy jest odwrotnie.Odmiana tej odpowiedzi :
źródło
Zakładam, że tutaj są okna. Musisz więc użyć WMI, aby uzyskać te informacje. Przejrzyj archiwa The Scripting Guy, aby znaleźć wiele przykładów używania WMI ze skryptu.
źródło
Użyłem skryptu dostarczonego przez Matta (02.10.2008). Jedyne, z czym miałem problem, to to, że nie usunąłby
search.log
pliku. Spodziewam się, ponieważ musiałemcd
wybrać inną lokalizację, aby uruchomić program. Jestemcd
„d z powrotem do miejsca, gdzie plik bat isearch.log
są, ale to nadal nie będzie usunąć. Rozwiązałem więc ten problem, usuwającsearch.log
plik najpierw zamiast ostatniego.źródło
Powinieneś sprawdzić nazwę procesu nadrzędnego, zobacz artykuł Code Project o rozwiązaniu opartym na .NET ** .
Nieprogramowy sposób sprawdzenia:
c:\windows\notepad.exe
)To samo można sprawdzić, uzyskując nazwę procesu nadrzędnego.
źródło
Opierając się na odpowiedź vtrz za i odpowiedzi w sprawie Samuela Renkert innym temacie , wpadłem na następujący skrypt, który działa tylko
%EXEC_CMD%
jeśli nie jest już uruchomiony:Jak powiedziano wcześniej, wymaga to uprawnień administracyjnych.
źródło
Node - (computer name) ERROR: Description = Invalid query
Potrzebowałem rozwiązania z ponowną próbą. Ten kod będzie działał do momentu znalezienia procesu, a następnie go zabije. Możesz ustawić limit czasu lub cokolwiek, jeśli chcesz.
Uwagi:
taskkill.bat
:Biegnij z
.\taskkill.bat ProgramToKill.exe
źródło
Zwykle wykonuję następujące polecenie w wierszu polecenia cmd, aby sprawdzić, czy mój program.exe jest uruchomiony, czy nie:
źródło