在 Windows PowerShell 脚本中检测虚拟(TrueCrypt)卷的安装

在 Windows PowerShell 脚本中检测虚拟(TrueCrypt)卷的安装

我正在使用以下 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 内的 truecrypt 容器。当脚本检测到正确的设备已安装为 G 时,它会休眠 5 秒钟,让 truecrypt 有时间安装 F,然后运行在 F 上找到的脚本。似乎只有在连接/断开物理驱动器时才会生成卷更改事件(至少这是脚本收到事件的唯一时间),因为保持 G 连接并安装/卸载 F 不会触发脚本。我希望能够检测到 truecrypt 容器何时安装,而不会发生任何其他变化。在某种程度上这一定是可能的,因为当容器安装或卸载时,Windows 资源管理器会更新其驱动器显示。感谢您的帮助。

答案1

我不太理解您提供的脚本,但我认为这部分可能对您有用。它不像使用 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'

在 Windows 7 Ultimate x64 上的 PS 3.0 中进行了测试。不过应该具有相当的向后兼容性。

编辑:嗯,我对上述内容的测试还比较初级,做过可以工作。但完整脚本似乎有点问题,至少在 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 命令,在卸载时再次运行 echo 命令。但是,从那时起,ISE 中的 Get-PSDrive 不会显示 X,无论其实际状态如何。

我在 ISE 中启动了一个新的 PowerShell 控制台并再次运行了完整的脚本,这次从已安装的 X 开始。第一个 while 循环成功退出,但$x -ne $null即使我的驱动器已卸载,条件上的 while 循环仍然卡住。终止脚本并检查Get-PSDrive显示,即使实际上不存在,PowerShell 实例仍显示 X 可用。

也许你会更幸运,或者找到解决方法。如果这确实有帮助,或者你找到了解决办法,请告诉我。

相关内容