当具有唯一序列号的 USB 驱动器连接时,脚本会检测并运行

当具有唯一序列号的 USB 驱动器连接时,脚本会检测并运行

当检测到具有特定序列号的 USB 驱动器刚刚插入时,脚本就会运行。

但它给出了这个错误信息:

{无法将值“Win32_PhysicalMedia='K:'”转换为类型“System.Management.ManagementObject”。错误:“未找到”}

脚本如下:

Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier
volumeChange
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"}
}

if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveSerial = ([wmi]"Win32_PhysicalMedia='$driveLetter'").SerialNumber

if ($driveSerial -eq '0401541bbf5130dceb26')
{
    msg * USB IS PLUGGED IN
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) 
Unregister-Event -SourceIdentifier volumeChange

答案1

这是一个很长的评论...

虽然我不会有太大的帮助,但看看你是否可以替换当前行以获得$driveSerial以下内容

$drive_serialnumber = Get-Partition -DriveLetter $driveLetter  | Get-Disk | select-object -ExpandProperty SerialNumber
$drive_serialnumber.trim()

来源 - Robin 的回答https://stackoverflow.com/questions/47590453/obtain-disk-serial-number-from-drive-letter

我刚刚试了一下,似乎可以正常工作。我遇到了一个错误,但它确实显示了序列号。

请参阅以下尝试的屏幕截图。

希望您能够在此基础上取得更大进步。

在此处输入图片描述


编辑1

我找到了错误的原因,DriveLetter equal to :驱动器号包含“:”。因此在代码中使用它之前,请先将其修剪掉。

我用过类似的东西

$TrimmedLetter = $driveLetter.TrimEnd(":")

编辑2

这是我的示例代码片段,它在 Windows 11 PC 上似乎运行良好。

Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
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"}
}

if ($eventType -eq 2)

{
# Set constant. Replace this with your own value in UpperCase.
$Const_Ser_Num = "1F5A1F0044CE" 
# Get the drive letter
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
# Remove ':' from the end of it
$TrimmedLetter = $driveLetter.TrimEnd(":")
# Get the serial number for the drive letter
$drive_serialnumber = Get-Partition -DriveLetter $TrimmedLetter  | Get-Disk | select-object -ExpandProperty SerialNumber
$drive_serialnumber = $drive_serialnumber.Trim()
write-host $drive_serialnumber  # <--For testing only
if ($drive_serialnumber.ToUpper() -eq $Const_Ser_Num)
   {
      #rest of your code....
      write-host ("Pen drive found")  # <--For testing only
   }

}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) 
Unregister-Event -SourceIdentifier volumeChange

请注意以下事项

  • 我这边的测试笔式驱动器的序列号为该1F5A1F0044CE值设置为大写字母的 $Const_Ser_Num
  • 我不是 PowerShell 专家,此代码中可能会出现无意错误
  • 我不知道-eq字符串是否区分大小写。因此使用 ToUpper() 更安全

在此处输入图片描述

相关内容