У меня был такой же вопрос, как и у вас, и я кое-что проработал с 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" в диспетчере задач.