3

Я использую следующий сценарий powershell, чтобы определить, когда смонтирован конкретный том, чтобы я мог запустить сценарий, который будет перемещать файлы с моего компьютера на устройство (я не очень разбираюсь в сценариях 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 'G:' -and $driveLabel -eq 'My Book')
    {
        write-host (get-date -format s) "     Starting task in 5 seconds..."
     start-sleep -seconds 5
        start-process "F:\copy_backups.bat"
    }
  }
  Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange

G - это внешний физический жесткий диск, а F - контейнер с истинным шифром в G. Когда скрипт обнаруживает, что правильное устройство смонтировано как G, он спит 5 секунд, чтобы дать время истинного шифрования для монтирования F, а затем запускает скрипт, найденный на F. события изменения громкости генерируются только тогда, когда физический диск подключен / отключен (по крайней мере, это единственный раз, когда сценарий получает событие), потому что если оставить G подключенным, а монтирование / демонтаж F не вызовет сценарий. Я хотел бы иметь возможность определять, когда контейнер truecrypt монтируется без каких-либо изменений. На некотором уровне это должно быть возможно, потому что проводник Windows обновляет отображение своих дисков, когда контейнер монтируется или демонтируется. Спасибо за помощь.

1 ответ1

0

Я не совсем понимаю сценарий, который вы предоставили, но я думаю, что этот бит может быть вам полезен. Это не так аккуратно, как использование триггеров WMI, но оно должно работать.

# The while loop in this script will naturally generate errors until F is mounted.
# This line shuts PowerShell up for awhile.
$ErrorActionPreference = 'SilentlyContinue'

# Loop the script until F is mounted.
while ($FMounted -eq $null)
{
    $FMounted = Get-PSDrive F
}

# Reset $ErrorActionPreference to default.
$ErrorActionPreference = 'Continue'

Протестировано в PS 3.0 на Windows 7 Ultimate x64. Должно быть довольно обратно-совместимым, хотя.

EDIT: Ну, мои тесты выше были немного более рудиментарными и сделали работу. Но полный сценарий, кажется, ломается немного, по крайней мере в ISE. Вот что работает для меня в консоли PowerShell.

$ErrorActionPreference = 'SilentlyContinue'
$x = Get-PSDrive X
while ($x -eq $null) {$x = Get-PSDrive X};echo 'X is mounted'

Команда будет правильно зависать, пока я не подключу диск TrueCrypt к X, затем она запустит команду echo и прекратит работу.

Я немного расширил сценарий в ISE и попытался сделать полный цикл do ... while, как вы сделали, добавив еще один цикл while, чтобы повесить сценарий, пока X не будет размонтирован. Он работал один раз для запуска команды echo, когда диск был смонтирован, и снова, когда он был размонтирован. Однако с тех пор Get-PSDrive изнутри ISE не показывает X независимо от его фактического статуса.

Я запустил новую консоль PowerShell в ISE и снова запустил полный сценарий, на этот раз начиная с уже смонтированного X. Первый цикл while успешно завершился, но цикл while, обусловленный $x -ne $null оставался застрявшим даже после того, как мой диск был размонтирован. Уничтожение сценария и проверка Get-PSDrive показали, что этот экземпляр PowerShell все еще показывает X как доступный, хотя его там на самом деле не было.

Может быть, вам повезет больше или вы найдете обходной путь. Пожалуйста, дайте мне знать, если это поможет, и если вы найдете решение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .