当检测到具有特定序列号的 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() 更安全