通过批处理循环禁止Windows允许USB设备节能

6
亲爱的, 我一直在苦苦思索如何禁用Windows允许USB读卡器节能,最终通过使用 RegShot ,我成功找到了负责这些设置的注册表项,因此我创建了两个注册表查询来扫描计算机:
REG QUERY HKLM /v SelectiveSuspendFeatureOn /s
REG QUERY HKLM /v EnableSelectiveSuspend /s

示例输出:

C:\Users\asd\Desktop>REG QUERY HKLM /v SelectiveSuspendFeatureOn /s

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\GemCCID SelectiveSuspendFeatureOn REG_DWORD 0x1

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\services\GemCCID SelectiveSuspendFeatureOn REG_DWORD 0x1

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\GemCCID SelectiveSuspendFeatureOn REG_DWORD 0x1

搜索结束:找到3个匹配项。

C:\Users\asd\Desktop>REG QUERY HKLM /v EnableSelectiveSuspend /s

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\IUSB3\ROOT_HUB30\4&22fe6fd&0\Device Parameters EnableSelectiveSuspend REG_DWORD 0x1

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\IUSB3\ROOT_HUB30\4&22fe6fd&0\Device Parameters EnableSelectiveSuspend REG_DWORD 0x1

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IUSB3\ROOT_HUB30\4&22fe6fd&0\De vice Parameters EnableSelectiveSuspend REG_DWORD 0x1

搜索结束:找到3个匹配项。

现在,我能够扫描这些位置并获取注册表路径,我想将它们每一个都设置为0,所以我找到并使用了这个.bat文件:

@echo off
cls
:startreg
cls
set regq= REG QUERY HKLM /v SelectiveSuspendFeatureOn /s %curuser%
for /f "tokens=* delims=~" %%A IN ('%regq% ^| findstr /i "HKEY_LOCAL_MACHINE"') DO set regkey=%%A

Reg add %regkey% /v SelectiveSuspendFeatureOn /t REG_DWORD /d 0 /f
rem Reg add %regkey% /v EnableSelectiveSuspend /t REG_DWORD /d 0 /f

pause
exit

现在问题出现了,我有两个与.bat本身相关的请求/问题:
  1. 应将REQ QUERY列出的每个项目都使用REG ADD命令设置为0-因此,我认为这应该以某种方式进行循环处理?输出命令必须生成到.reg文件中(下面是示例)。
  2. 如何添加第二个选项来启用选择性暂停,是否有一种方法可以对其进行双重循环?

@@ EDIT.1 @@

结果证明,某些注册表键无法通过.bat更改(无法读取路径),因此应生成.reg文件:

正确的.reg文件示例:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\GemCCID] "SelectiveSuspendFeatureOn"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\services\GemCCID] "SelectiveSuspendFeatureOn"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\GemCCID] "SelectiveSuspendFeatureOn"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Enum\IUSB3\ROOT_HUB30\4&32305751&0\Device Parameters] "EnableSelectiveSuspend"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Enum\USB\VID_0424&PID_2512\5&36b4634f&0&3\Device Parameters] "EnableSelectiveSuspend"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Enum\USB\VID_0424&PID_2514\6&234568e7&0&1\Device Parameters] "EnableSelectiveSuspend"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IUSB3\ROOT_HUB30\4&32305751&0\Device Parameters] "EnableSelectiveSuspend"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_0424&PID_2512\5&36b4634f&0&3\Device Parameters] "EnableSelectiveSuspend"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_0424&PID_2514\6&234568e7&0&1\Device Parameters] "EnableSelectiveSuspend"=dword:00000000

期待您的答复。

Patryk

@@ EDIT 2 @@

我设法创建所需的逻辑:

@echo off

cls
:startreg
cls
echo Scanning computer in order to apply Power Managment adjustments for USB readers
set NLM=^
set NL=^^^%NLM%%NLM%^%NLM%%NLM%
echo Windows Registry Editor Version 5.00 > %1/scanned.reg
echo. >> %1/scanned.reg
set regq= REG QUERY HKLM /v SelectiveSuspendFeatureOn /s %curuser%
for /f "tokens=* delims=\\n" %%A IN ('%regq% ^| findstr /i "HKEY_LOCAL_MACHINE"') DO echo [%%A] >> %1/scanned.reg & echo "SelectiveSuspendFeatureOn"=dword:00000000 >> %1/scanned.reg & echo.  >> %1/scanned.reg

set regq= REG QUERY HKLM /v EnableSelectiveSuspend /s %curuser%
for /f "tokens=* delims=\\n" %%A IN ('%regq% ^| findstr /i "HKEY_LOCAL_MACHINE"') DO echo [%%A] >> %1/scanned.reg & echo "EnableSelectiveSuspend"=dword:00000000 >> %1/scanned.reg & echo.  >> %1/scanned.reg

regedit.exe /S %1/scanned.reg

exit

这个程序会扫描Windows注册表,将这些值保存为.reg文件,并最终运行.reg文件来应用更改。

在注册表更新后,需要重新启动系统。

这个程序添加了“路径”参数,所以你应该使用参数(例如“C:”或任何其他路径)运行这个.bat文件。


1
请勿更改除CurrentControlSet之外的任何设置。您似乎正在尝试更改多个设备的设置,而不知道它们是什么。此外,您似乎有一个\CurrentControlSet004\键,这可能表明您以前曾遭受过注册表损坏。您附加为编辑的脚本设置了两个未使用的变量,包含一个未定义的变量,并且似乎在运行之前将参数作为输入进行了处理,而没有进行验证。 - Compo
1
亲爱的Compo, 这是为了查找USB HUB和设备并禁止Windows保存这些设备的电源,而不是通过设备管理器手动操作多个设备。 您提到了未使用的变量,但您是否注意到同时正在生成.reg文件? 作为输入的参数是一个{path}变量,这对我的安装是必需的。 - icek
我知道文件的预期功能,以及您将路径作为输入参数**%1。请告诉我%NLM%%NL%%curuser%**的目的。如果您的意思是我没有注意到您正在将东西回显到reg文件中,那么您就错了。我也完全了解CurrentControlSet键的目的以及它们的工作原理,并且任何一个集合的损坏都意味着另一个集合将用于修复。 (因此,破坏多个集合是不明智的)。 - Compo
同样的,就像我说的那样,你不知道那些设备是什么,你只是在毫无后果的情况下改变每个设备的状态,尽管这是你的权利,但也是我的权利警告你不要这样做。在你查询注册表时,你还要进行整个根键的递归子键搜索,尽管你知道每个所需值都位于SYSTEM分支内。在你实际创建的注册表文件中,你已经盲目导入,你有注意到它里面没有任何值数据吗? - Compo
1
如果你的第二次编辑解决了你的问题,你可以将其发布为答案并接受它。 - Revenant
请从您的标题中删除“已解决”,并将您的解决方案作为正确的答案发布。 - Jongware
1个回答

0

我成功创建了所需的逻辑:

@echo off

cls
:startreg
cls
echo Scanning computer in order to apply Power Managment adjustments for USB readers
echo Windows Registry Editor Version 5.00 > %1/scanned.reg
echo. >> %1/scanned.reg
set regq= REG QUERY HKLM /v SelectiveSuspendFeatureOn /s %curuser%
for /f "tokens=* delims=\\n" %%A IN ('%regq% ^| findstr /i "HKEY_LOCAL_MACHINE"') DO echo [%%A] >> %1/scanned.reg & echo "SelectiveSuspendFeatureOn"=dword:00000000 >> %1/scanned.reg & echo.  >> %1/scanned.reg

set regq= REG QUERY HKLM /v EnableSelectiveSuspend /s %curuser%
for /f "tokens=* delims=\\n" %%A IN ('%regq% ^| findstr /i "HKEY_LOCAL_MACHINE"') DO echo [%%A] >> %1/scanned.reg & echo "EnableSelectiveSuspend"=dword:00000000 >> %1/scanned.reg & echo.  >> %1/scanned.reg

regedit.exe /S %1/scanned.reg

exit

这个程序正在扫描Windows注册表,然后将这些值保存为.reg键,并最终运行.reg文件以应用更改。

在注册表更新后 - 需要重新启动系统。

这个程序添加了参数"path",因此您应该使用参数运行这个.bat文件,例如"C:"或任何其他路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接