У меня был такой же вопрос, как и у вас, и я кое-что проработал с PowerShell (встроенными сценариями Windows), используя приемы из блога сценаристов здесь и здесь . Сценарий выполняется непрерывно как фоновый процесс, который можно запустить при входе в систему с помощью планировщика задач. Сценарий будет уведомлен всякий раз, когда подключен новый диск, и затем что-то предпринимает (здесь вы настраиваете сценарий, а не задачу). Так как он в основном приостановлен во время ожидания следующего подключенного диска, вы не должны обнаружить, что он занимает много ресурсов. Здесь я иду:
1) Запустите Powershell ISE, который можно найти в меню «Пуск» в разделе «Стандартные» / «Windows Powershell». 2) Скопируйте и вставьте следующее в 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) Вам нужно изменить приведенный выше скрипт, чтобы указать скрипту, какой диск искать и что выполнять. Две строки для изменения:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Мой жесткий диск USB с именем Mirror установлен как диск Z :. Вы можете просто использовать, if ($driveLabel -eq 'MyDiskLabel')
если вы не заботитесь о письме.
start-process "Z:\sync.bat"
Путь любой задачи, которую вы хотите сделать. В моем примере я создал командный файл на моем USB-накопителе, который запускает 3-4 командные строки задач резервного копирования.
4) Когда вы закончите, сохраните ваш скрипт где-нибудь (расширение .ps1
), а затем создайте задачу в планировщике задач, чтобы ваш скрипт работал в фоновом режиме. Моя выглядит так:
- Триггер: при входе в систему
- Действие: запустить программу
- Программа / скрипт: powershell
- Добавьте аргументы:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Вуаля!
6) Дополнительные вещи:
Если вы хотите, чтобы окно вашего скрипта было скрыто, используйте следующие аргументы:
- Добавьте аргументы:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Если вы хотите вывести сообщения сценария в файл журнала (который перезаписывается при каждом запуске сценария, т. Е. При входе в систему), используйте следующее действие задачи:
- Программа / скрипт: cmd
- Добавить аргументы:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "
В любое время, когда вы хотите завершить выполнение скрытого скрипта, вы можете завершить процесс «Powershell» в диспетчере задач.
Единственным недостатком является то, что ничего не запустится, когда вы загрузите свой компьютер с уже подключенным диском. (Хотя сценарий может быть изменен, чтобы сначала выполнить первую проверку, но на сегодня хватит!)
$newEvent.SourceEventArgs.NewEvent
для интересующих вас событий.Как я уже объяснял в этом обсуждении (но речь шла о запуске программы при извлечении USB-накопителя), USB Safely Remove , хотя и не свободная, может запускать программу при возникновении некоторых событий на USB-устройствах:
Конечно, это не полностью отвечает на вопрос, поскольку речь идет не об использовании запланированных задач, но я думаю, что цель та же, что и запуск конкретной программы при подключении USB-накопителя.
источник
Это должно быть довольно легко, используя EventVwr.
Найдите нужное событие. Когда я подключил запоминающее устройство USB, оно вызвало следующие события (в категории приложений): 20001, 20003, 7036 и некоторые другие, менее важные. Убедитесь, что вы проверяете эти события с событиями других USB-устройств, чтобы избежать ложных срабатываний.
щелкните правой кнопкой мыши по событию и нажмите «Прикрепить задачу к этому событию» (актуально только в Windows Vista или более поздней версии - для XP есть CLI EventTrigger), выберите «Запустить программу» и укажите на сценарий, который вы хотите запустить.
Чтобы передать в сценарий параметры события, нужно заглянуть в эту статью . Под событиями 20001 и 20003 вы можете найти UNC-путь к новому хранилищу. С помощью утилиты Sysinternals Junction вы можете создавать ссылки на пути UNC.
источник
Мне удалось заставить это работать: я обнаружил событие 1003 в журналах приложений и служб, Microsoft-Windows-DriverFrameworks-UserMode для телефона, подключенного к USB
Полный xml мероприятия:
И пользовательский фильтр событий для моей задачи:
Аналогично для USB-накопителя это было событие 2100, 2101, 2105, 2106.
Для конкретного USB-накопителя:
Похоже, что событие 2101 происходит 3 раза с немного другими
"<request>"
тегами, когда я подключаю USB-накопитель:Я понятия не имею, что это значит, но вот фильтр только для одного из них, чтобы избежать нескольких триггеров: (это будет срабатывать только для этого конкретного USB-накопителя)
Обратите внимание, что амперсанды должны быть экранированы как
&
источник
Как уже упоминалось, кажется, что Событие 7036 системного журнала от Service Control Manager является единственным событием, которое надежно связано с подключаемым USB-накопителем. Я проверил это, вставив USB-накопитель и выполнив следующую команду powershell, чтобы вывести список всех записей журнала событий из всех источников за последний час:
К сожалению, событие 7036 генерируется каждый раз, когда диспетчер управления службами успешно запускает или останавливает какую-либо службу, поэтому требуется дополнительная фильтрация.
Фильтрация, доступная в графическом интерфейсе Event Viewer / Task Scheduler, довольно проста и не позволяет выполнять какую-либо фильтрацию данных события - она позволяет фильтровать только метаданные, которые в этом случае ничего не говорят о том, какая служба имеет изменилось состояние и в каком состоянии оно изменилось. Это содержится в «param1» и «param2» EventData. Поэтому следующий фильтр XPath может использоваться для захвата только запуска соответствующей службы:
Оттуда вы можете запустить свой сценарий, в идеале с некоторой дополнительной логикой, чтобы проверить, что USB-накопитель, который был вставлен, является тем, который вас интересует.
источник
Я нашел лучшее (IMO) событие из журнала событий, расположенного в разделе Журналы приложений и служб-Microsoft-Windows-Ntfs_Operational. Eventid 4. Это выглядит так:
Код события 4 Том NTFS успешно смонтирован.
Из этого вы можете создать триггер запланированной задачи и фильтр по имени тома и / или метке. Это событие было найдено в Windows Server 2019, однако по какой-то причине я не вижу его на своем рабочем столе Windows 10 (1809). Может быть событие только для сервера ....
источник