即使 Windows 的省电功能设置为永不关闭硬盘,我的外部 USB 硬盘在闲置一段时间后仍会自动停止旋转。问题是,当计算机空闲或观看电影/听音乐时,它们会随机重新旋转;这真的很烦人(不仅是因为它发出的噪音,还因为它每次这样做都会给驱动器带来不必要的压力,这种情况每天发生十几次,这让我很担心)。我遇到了一个旧的免费软件实用程序,它可以非常有效地解决 SATA / eSATA 驱动器的这种烦恼。它叫做revoSleep该实用程序的文档揭示了诀窍是使磁盘脱机、使其旋转,然后禁用其设备驱动程序。
这启发我寻找类似的 USB 驱动器解决方案,但到目前为止,我找不到可以毫无问题地运行的软件实用程序。使用 diskpart,我能够将 USB 磁盘脱机。接下来,使用名为 HDDScan for Windows 的免费软件实用程序(类似于“hdparm”),我可以降低磁盘转速,甚至可以从批处理文件中执行此操作。很好。
最后一步是禁用磁盘的设备驱动程序,从同一个批处理文件中而不是使用设备管理器。使用另一个名为 DevCon 的免费软件实用程序,我很快就能识别出正确的设备驱动程序。事实证明,旧版本的 DevCon(从 2003 年开始)无法禁用 Windows 7 或 8 上的设备驱动程序。因此,我最终从 Microsoft 的下载中心下载了驱动程序开发工具包 (DDK) 7.1.0 以获取可用的版本。解决该问题后,我终于能够禁用 USB 硬盘的设备驱动程序了。现在我的问题来了。在批处理文件(或 WSH 脚本等)中自动执行这些步骤的最佳(即最可靠)方法是什么,以便批处理文件/脚本不会意外地为其将要执行的任何命令选择错误的驱动器?
FWIW,我遇到了这帖子,但示例代码仅使用卷标的前 11 个字符来查找分区号。相反,我希望它使用(如果可能)硬盘的唯一序列号来查找磁盘号,以便能够使正确的磁盘脱机。
答案1
这可能会有帮助。
如果您知道硬盘的序列号,则可以使用下面的批处理脚本获取驱动器号。然后,您可以使用驱动器号通过 diskpart 发现卷或磁盘号。
@echo off
setlocal EnableDelayedExpansion
set "xDrive="
rem Loop through all of the drives to find the external HDD
for %%D in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
for /f "tokens=5" %%S in ('vol %%~D:') do set "xSerial=%%S"
if "%xSerial%"=="ABCD-1234" (
set "xDrive=%%~D:"
)
)
echo Drive Found = %xDrive%
endlocal
pause
答案2
我能够编写一个 PowerShell 3.0 脚本,使用 Diskpart 将我的外部 USB HDD 脱机,然后使用 HDDScan for Windows 将其旋转下来,最后使用 DevCon 禁用其设备驱动程序。但是,几分钟后 HDD 重新旋转,然后立即再次旋转。我验证了此症状仅在我的脚本运行后出现一次。我将发布有关此问题的新问题。