Saya memiliki pertanyaan yang sama dengan Anda, dan mengerjakan sesuatu dengan PowerShell (windows built-in scripting) menggunakan teknik dari Scripting Guy Blog di sini dan di sini . Script berjalan terus menerus sebagai proses latar belakang, yang dapat Anda mulai pada logon sistem dengan penjadwal tugas. Script akan diberitahukan setiap kali drive baru dicolokkan dan kemudian melakukan sesuatu (di sini Anda mengkonfigurasi skrip daripada tugas). Karena pada dasarnya dijeda saat menunggu drive terpasang yang berikutnya, Anda tidak perlu menghabiskan banyak sumber daya. Ini dia:
1) Mulai Powershell ISE, yang dapat ditemukan di menu mulai Anda di bawah Accessories / Windows Powershell. 2) Salin rekatkan yang berikut ke 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) Anda perlu memodifikasi skrip di atas untuk memberi tahu skrip drive apa yang harus dicari, dan apa yang harus dijalankan. Dua baris yang akan diubah adalah:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Hard drive usb saya bernama 'Mirror' diset sebagai drive Z :. Anda bisa menggunakannya if ($driveLabel -eq 'MyDiskLabel')
jika Anda tidak peduli dengan surat itu.
start-process "Z:\sync.bat"
Jalur tugas apa pun yang ingin Anda lakukan. Dalam contoh saya, saya telah membuat file batch pada drive USB saya yang mulai 3-4 baris perintah tugas cadangan.
4) Setelah selesai, simpan skrip Anda di suatu tempat (ekstensi .ps1
), lalu buat tugas di Penjadwal Tugas agar skrip Anda berjalan di latar belakang. Milik saya terlihat seperti ini:
- Pemicu: Saat masuk
- Tindakan: Mulai program
- Program / skrip: PowerShell
- Tambahkan argumen:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voa!
6) Barang ekstra:
Jika Anda ingin jendela skrip Anda disembunyikan, gunakan argumen ini:
- Tambahkan argumen:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Jika Anda ingin menampilkan pesan skrip ke file log (yang ditimpa setiap kali skrip dimulai, yaitu saat masuk), gunakan tindakan tugas berikut:
- Program / skrip: cmd
- Tambahkan argumen:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
Kapan pun Anda ingin mengakhiri skrip tersembunyi yang sedang berjalan, Anda bisa mengakhiri proses "Powershell" di Task Manager.
Satu-satunya downside adalah bahwa tidak ada yang akan berjalan ketika Anda mem-boot komputer Anda dengan drive sudah terpasang. (Script dapat diubah untuk melakukan pemeriksaan pertama pada awalnya, tetapi saya sudah cukup untuk hari ini!)
$newEvent.SourceEventArgs.NewEvent
untuk acara yang Anda minati.Seperti yang sudah saya jelaskan pada diskusi ini (tapi itu tentang menjalankan program ketika drive USB dilepas), USB Safely Remove , meskipun tidak gratis, dapat menjalankan program ketika beberapa peristiwa tentang perangkat USB dipicu:
Tentu saja, ini tidak sepenuhnya menjawab pertanyaan, karena ini bukan tentang menggunakan tugas yang dijadwalkan, tetapi tujuannya sama, saya pikir, yaitu menjalankan program tertentu ketika stik USB dicolokkan.
sumber
Seharusnya cukup mudah menggunakan EventVwr.
Temukan acara yang Anda inginkan - Ketika saya menyambungkan perangkat penyimpan massal USB, ia memicu peristiwa berikut (di bawah kategori aplikasi): 20001, 20003, 7036 dan beberapa lainnya yang kurang relevan. Pastikan Anda menguji peristiwa itu terhadap peristiwa perangkat USB lain untuk menghindari kesalahan positif.
klik kanan pada acara tersebut dan klik "Lampirkan tugas ke acara ini" (hanya relevan di Windows Vista atau lebih tinggi - untuk XP ada CLI EventTrigger), pilih "Mulai Program" dan arahkan ke skrip yang ingin Anda jalankan.
Untuk meneruskan ke skrip, parameter acara Anda perlu melihatnya di artikel ini . Di bawah peristiwa 20001 dan 20003 Anda dapat menemukan jalur UNC ke penyimpanan baru. Menggunakan utilitas Sysinternals Junction Anda dapat membuat tautan ke jalur UNC.
sumber
Saya dapat menjalankan ini: Saya menemukan event 1003 di aplikasi dan layanan log, Microsoft-Windows-DriverFrameworks-UserMode untuk telepon yang terhubung ke usb
Xml penuh acara:
Dan filter acara khusus untuk tugas saya:
Demikian pula untuk drive USB itu acara 2100, 2101, 2105, 2106
Untuk Drive USB tertentu:
Sepertinya peristiwa 2101 terjadi 3 kali dengan
"<request>"
tag yang sedikit berbeda ketika saya mencolokkan drive usb saya:Saya tidak tahu apa artinya ini tetapi di sini adalah filter untuk hanya satu dari mereka untuk menghindari beberapa pemicu: (ini hanya akan memicu untuk drive USB khusus ini)
Perhatikan bahwa ampersand harus diloloskan sebagai
&
sumber
Seperti yang telah disebutkan orang lain, tampaknya System log Event 7036 dari Service Control Manager adalah satu-satunya peristiwa yang berkorelasi secara andal dengan drive USB yang dimasukkan. Saya memeriksa ini dengan memasukkan drive USB dan menjalankan perintah PowerShell berikut untuk mendaftar semua entri log peristiwa dari semua sumber dalam satu jam terakhir:
Sayangnya, Peristiwa 7036 dihasilkan setiap kali Manajer Kontrol Layanan berhasil memulai atau menghentikan layanan apa pun, sehingga diperlukan penyaringan tambahan.
Pemfilteran yang tersedia di GUI dari Peraga Peristiwa / Penjadwal Tugas cukup mendasar dan tidak memungkinkan pemfilteran pada data acara - ini hanya memungkinkan Anda memfilter pada metadata yang dalam hal ini tidak memberi tahu Anda apa pun tentang layanan yang memiliki mengubah status dan status apa yang telah diubah. Itu diadakan di "param1" dan "param2" dari EventData. Karena itu filter XPath berikut dapat digunakan untuk menangkap hanya layanan yang relevan yang memulai:
Dari sana Anda dapat menjalankan skrip, idealnya dengan beberapa logika tambahan untuk memeriksa apakah drive USB yang telah dimasukkan adalah yang Anda minati.
sumber
Saya menemukan acara (IMO) yang lebih baik dari log peristiwa yang terletak di bawah Aplikasi dan Log Layanan-Microsoft-Windows-Ntfs_Operational. Eventid 4. Sepertinya ini:
ID Peristiwa 4 Volume NTFS telah berhasil dipasang.
Dari itu Anda dapat membuat pemicu tugas yang dijadwalkan dan memfilter menurut nama volume dan atau label. Acara ini ditemukan pada kotak Windows Server 2019, namun karena beberapa alasan saya tidak melihatnya di desktop Windows 10 (1809) saya. Mungkin hanya acara server ....
sumber