Miałem to samo pytanie co ty i opracowałem coś z PowerShell (wbudowane skrypty systemu Windows), używając technik z blogu Scripting Guy tutaj i tutaj . Skrypt działa nieprzerwanie jako proces w tle, który można rozpocząć przy logowaniu systemowym za pomocą harmonogramu zadań. Skrypt zostanie powiadomiony za każdym razem, gdy nowy dysk zostanie podłączony, a następnie coś zrobi (tutaj konfigurujesz skrypt, a nie zadanie). Ponieważ jest zasadniczo wstrzymany podczas oczekiwania na następny podłączony dysk, nie powinieneś uważać, że zajmuje dużo zasobów. Teraz ja:
1) Uruchom program Powershell ISE, który można znaleźć w menu Start w obszarze Akcesoria / Windows Powershell. 2) Skopiuj następujące elementy do programu PowerShell:
#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "Z:\sync.bat"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange
3) Musisz zmodyfikować powyższy skrypt, aby wskazać skryptowi, którego dysku szukać i co wykonać. Dwie linie do zmiany to:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Mój dysk twardy USB o nazwie „Mirror” jest ustawiony jako dysk Z:. Możesz użyć, if ($driveLabel -eq 'MyDiskLabel')
jeśli nie obchodzi cię list.
start-process "Z:\sync.bat"
Ścieżka do dowolnego zadania, które chcesz wykonać. W moim przykładzie utworzyłem plik wsadowy na dysku USB, który uruchamia 3-4 wiersze poleceń zadań tworzenia kopii zapasowych.
4) Po zakończeniu zapisz gdzieś skrypt (rozszerzenie .ps1
), a następnie utwórz zadanie w Harmonogramie zadań, aby skrypt działał w tle. Mój wygląda następująco:
- Wyzwalacz: przy logowaniu
- Działanie: Uruchom program
- Program / skrypt: powershell
- Dodaj argumenty:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) Dodatkowe rzeczy:
Jeśli chcesz ukryć okno skryptu, użyj następujących argumentów:
- Dodaj argumenty:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Jeśli chcesz wyprowadzić komunikaty skryptu do pliku dziennika (który jest nadpisywany przy każdym uruchomieniu skryptu, tj. Przy logowaniu), użyj następującej czynności zadania:
- Program / skrypt: cmd
- Dodaj argumenty:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt ”
Za każdym razem, gdy chcesz zakończyć działający ukryty skrypt, możesz zakończyć proces „Powershell” w Menedżerze zadań.
Jedynym minusem jest to, że nic się nie uruchomi, gdy uruchomisz komputer z już podłączonym napędem. (Skrypt można zmienić, aby wykonać pierwszą kontrolę początkowo, ale mam dość na dziś!)
$newEvent.SourceEventArgs.NewEvent
wydarzeń, którymi jesteś zainteresowany.Jak już wyjaśniłem w tej dyskusji (ale chodziło o uruchomienie programu po odłączeniu napędu USB), Bezpieczne usuwanie USB , chociaż nie jest wolne, może uruchomić program, gdy zostaną uruchomione niektóre zdarzenia dotyczące urządzeń USB:
Oczywiście to nie w pełni odpowiada na pytanie, ponieważ nie chodzi o korzystanie z zaplanowanych zadań, ale myślę, że cel jest taki sam, a mianowicie uruchomienie określonego programu po podłączeniu pamięci USB.
źródło
Korzystanie z EventVwr powinno być dość łatwe.
Znajdź odpowiednie wydarzenie - kiedy podłączyłem urządzenie pamięci masowej USB, wywołało następujące zdarzenia (w kategorii aplikacji): 20001, 20003, 7036 i kilka innych mniej istotnych. Upewnij się, że testujesz te zdarzenia na zdarzeniach innych urządzeń USB, aby uniknąć fałszywych alarmów.
kliknij prawym przyciskiem myszy zdarzenie i kliknij „Dołącz zadanie do tego zdarzenia” (dotyczy tylko systemu Windows Vista lub nowszego - w systemie XP istnieje CLI EventTrigger), wybierz „Uruchom program” i wskaż skrypt, który chcesz uruchomić.
Aby przekazać do skryptu parametry zdarzenia, zajrzyj do tego artykułu . W ramach wydarzeń 20001 i 20003 można znaleźć ścieżkę UNC do nowego magazynu. Za pomocą narzędzia Sysinternals Junction można utworzyć łącza do ścieżek UNC.
źródło
Udało mi się to uruchomić: znalazłem zdarzenie 1003 w dziennikach aplikacji i usług, Microsoft-Windows-DriverFrameworks-UserMode dla telefonu podłączonego do USB
Pełny plik XML wydarzenia:
A niestandardowy filtr zdarzeń dla mojego zadania:
Podobnie w przypadku napędu USB było to zdarzenie 2100, 2101, 2105, 2106
W przypadku konkretnego napędu USB:
Wygląda na to, że zdarzenie 2101 zdarza się 3 razy z nieco innymi
"<request>"
tagami po podłączeniu dysku USB:Nie mam pojęcia, co to oznacza, ale tutaj jest filtr tylko jednego z nich, aby uniknąć wielu wyzwalaczy: (uruchomi się tylko dla tego konkretnego napędu USB)
Pamiętaj, że znaki ampersands muszą być oznaczone jako
&
źródło
Jak wspomnieli inni, wydaje się, że zdarzenie 7036 dziennika systemu z Menedżera sterowania usługami jest jedynym zdarzeniem, które niezawodnie koreluje z włożonym napędem USB. Sprawdziłem to, wkładając dysk USB i uruchamiając następującą komendę PowerShell, aby wyświetlić wszystkie wpisy dziennika zdarzeń ze wszystkich źródeł w ciągu ostatniej godziny:
Niestety zdarzenie 7036 jest generowane za każdym razem, gdy Menedżer kontroli usług pomyślnie uruchamia lub zatrzymuje dowolną usługę, dlatego wymagane jest dodatkowe filtrowanie.
Filtrowanie dostępne w interfejsie GUI Podglądu zdarzeń / Harmonogramu zadań jest dość proste i nie pozwala na żadne filtrowanie danych zdarzeń - pozwala jedynie filtrować metadane, które w tym przypadku nie mówią nic o tym, która usługa ma zmienił stan i do jakiego stanu się zmienił. Odbywa się to w „param1” i „param2” EventData. Dlatego można użyć następującego filtra XPath do przechwytywania tylko odpowiedniej usługi podczas uruchamiania:
Stamtąd możesz uruchomić skrypt, najlepiej z dodatkową logiką, aby sprawdzić, czy włożony dysk USB jest tym, który Cię interesuje.
źródło
Znalazłem lepsze (IMO) zdarzenie z dziennika zdarzeń znajdującego się w obszarze Aplikacje i dzienniki usług-Microsoft-Windows-Ntfs_Operational. Eventid 4. Wygląda to tak:
Identyfikator zdarzenia 4 Wolumin NTFS został pomyślnie podłączony.
Na tej podstawie możesz utworzyć zaplanowane wyzwalacz zadania i filtrować według nazwy woluminu i / lub etykiety. To wydarzenie zostało znalezione na pudełku Windows Server 2019, jednak z jakiegoś powodu nie widzę go na pulpicie Windows 10 (1809). Może to być wydarzenie tylko dla serwera ....
źródło