#windows #powershell #task #wmi #background_task
Надо сделать, чтобы при подключении определенной флешки запускалась программа. В интернете пишут, что можно через планировщик, но никто не пишет, как именно.
Ответы
Ответ 1
Я слегка слукавил, без планировщика не обойтись, хотя, наверное, можно и через автозагрузку решить всё это. Я для одного пожилого сотрудника когда-то использовал вот такой скрипт, который срабатывал, если вставлялась флэшка, автоопределяемая с буквой T и меткой "BP_flahka". Если буква диска не важна, то вместо if ($driveLetter -eq 'T:' -and $driveLabel -eq 'BP_flashka') можно использовать просто if ($driveLabel -eq 'ТутМеткаВашейФлэшки'). Код скрипта: #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 # Запустить, если буква диска и метка совпали с нужными значениями if ($driveLetter -eq 'T:' -and $driveLabel -eq 'BP_flashka') { write-host (get-date -format s) " Starting task in 3 seconds..." start-sleep -seconds 3 start-process "E:\sync.bat" } } Remove-Event -SourceIdentifier volumeChange } while (1-eq1) #Идём в цикле дальше Unregister-Event -SourceIdentifier volumeChange Дальше всё просто. В планировщике создаём новое задание, с такими параметрами: Триггер: At log on Действие: Start a program Program/script: powershell Аргументы: -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "Диск:\Путь\имя файла со скриптом.ps1" Update 1. Проверок для вставляемого хранилища можно устроить массу. Например: # узнаем тип файловой системы флэшки $fileSystem = ([wmi]"Win32_LogicalDisk='$driveLetter'").FileSystem # проверяем, сколько свободного места осталось (в байтах) на флэшке $freeSpace = ([wmi]"Win32_LogicalDisk='$driveLetter'").FreeSpace # или общий размер всей флэшки: $size = ([wmi]"Win32_LogicalDisk='$driveLetter'").Size # и так далее, а затем просто проверяем нужный нам параметр, например: if ($fileSystem -eq 'NTFS') { # в этом случае бэкап можно делать одним большим файлом } # и так далее Update 2. Работать будет, начиная с Windows Vista/Server 2008
Комментариев нет:
Отправить комментарий