Надо сделать, чтобы при подключении определенной флешки запускалась программа. В интернете пишут, что можно через планировщик, но никто не пишет, как именно.
Ответ
Я слегка слукавил, без планировщика не обойтись, хотя, наверное, можно и через автозагрузку решить всё это.
Я для одного пожилого сотрудника когда-то использовал вот такой скрипт, который срабатывал, если вставлялась флэшка, автоопределяемая с буквой 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
Комментариев нет:
Отправить комментарий