我目前正在学习如何创建批处理脚本,但到目前为止,我只是在进行查询。我能够在以下注册表路径中获取当前硬件,设备映射和串行com的列表
HKLM\hardware\devicemap\serialcomm
问题是每台计算机在同一设备上显示不同的serialcomm
。所以我试图根据设备名称捕获serialcomm
。
我目前的代码如下:
reg query HKLM\hardware\devicemap\serialcomm
pause
以下是我尝试根据硬件名称获取serialcomm
的更新代码,但无法正常工作:(
set "Comm="
reg query HKLM\hardware\devicemap\serialcomm
if %%hardware%% = ProlificSerial0 set Comm=%%serialcomm%%
pause
上面的代码是基于我在多个网站上找到的所有信息创建的,但正如我所说,我仍在学习查询,而且添加更多代码对我来说有点复杂。
如果有人能告诉我更新的代码有什么问题,我将不胜感激。
答案 0 :(得分:0)
我的机器上没有serialcomm,但您可以将其用作参考:
@echo off
for /f "tokens=3* delims= " %%a in (
'reg query HKLM\hardware\devicemap\pointerclass'
) do (
set "pointer=%%a"
)
echo %pointer%
if "%pointer%" equ "REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\mouclass" echo need to set something
答案 1 :(得分:0)
您应该将要查找的特定值作为参数传递给批处理文件。例如,如果您的批处理文件名为 RegSearch ,则命令行语法应为:例如:
RegSearch ProlificSerial0
因此,您应该在批处理文件中进行一些语法检查,以确保在运行批处理文件时忘记指定参数。 此外,您可以将 / v 参数添加到 Reg Query 命令,以查找特定值(而不是查看所有键)。然后,您可以使用 findstr 过滤查询结果,以确定它是否成功。
以下代码应该完成所有这些:
@echo off
setlocal enabledelayedexpansion
if /i "%1"=="" goto syntax
set myValue=%1
for /f "tokens=3 delims= " %%a in ('reg query hklm\hardware\devicemap\serialcomm /v *%myValue%* ^| findstr /i %myValue%') do (
set comm=%%a
echo !comm!
)
goto :eof
:syntax
echo.
echo ERROR : invalid syntax. You must pass the value to look for as the first argument, for example:
echo RegSearch Prolificserial0
答案 2 :(得分:0)
这是一个批处理代码,其中包含一些解释注释,这些注释是我几周前编写的用于通过批处理文件对Atmel AVR控制器进行编程,使用mySmartUSB MK2在安装了设备驱动程序后作为虚拟串行通信端口安装。用于编程AVR控制器的熔丝位,闪存和eeprom的代码部分在此由一条简单的信息消息替换。
批处理文件确定COM端口号
对于这个问题,Windows注册表中的标识是最有趣的部分。
DeviceInstance
,HardwareID
和ProductName
必须适用于Prolific USB转串口转换器。
在注册表项上查看Windows注册表编辑器
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
,用于Prolific USB转串口转换器的设备实例标识符和硬件标识符(供应商和产品标识符)。
@echo off
setlocal EnableExtensions
set "ComPort="
set "DeviceInstance=mySmartUSB2-0001"
set "HardwareID=VID_10C4&PID_EA60"
set "ProductName=mySmartUSB MK2"
cls
echo.
call :ProcessArguments %*
call :CheckPort
echo Serial port of %ProductName% is: COM%ComPort%
echo.
endlocal
pause
goto :EOF
rem The subroutine ProcessArguments processes the optional parameters of
rem the batch file. For this demo everything except COMx with x being a
rem number in range 1 to 255 is interpreted as unknown parameter.
:ProcessArguments
set "EmptyLine=0"
:NextArgument
if "%~1" == "" (
if "%EmptyLine%" == "1" echo.
goto :EOF
)
set "SerialPort=%~1"
if /I "%SerialPort:~0,3%" == "com" (
set "ComPort=%SerialPort:~3%"
) else (
echo ERROR: Unknown parameter: %1
set "EmptyLine=1"
)
shift
goto NextArgument
rem The subroutine CheckPort checks the port number specified as parameter
rem on calling the batch file.
rem In case of no COM port number was specified as parameter, it attempts
rem to determine the COM port number for the device as defined at top of
rem the batch file directly from Windows registry. The registry query is
rem written to work for Windows XP and any later Windows.
rem Last in case of a valid COM port was whether passed to the batch file
rem via COMx parameter nor could the port number be determined from Windows
rem registry automatically, the user is prompted in a loop to enter a valid
rem port number.
:CheckPort
set "EmptyLine=0"
if not "%ComPort%" == "" goto VerifyPort
for /F "skip=2 tokens=1,3" %%A in ('%SystemRoot%\System32\reg.exe QUERY "HKLM\SYSTEM\CurrentControlSet\Enum\USB\%HardwareID%\%DeviceInstance%\Device Parameters" /v PortName 2^>nul') do (
if /I "%%A" == "PortName" set "SerialPort=%%B" && goto GetPortNumber
)
goto EnterPort
:GetPortNumber
if /I "%SerialPort:~0,3%" == "com" (
set "ComPort=%SerialPort:~3%"
goto VerifyPort
)
:EnterPort
set "EmptyLine=1"
set "ComPort=4"
set /P "ComPort=Enter number of COM port (default: %ComPort%): "
:VerifyPort
for /F "delims=0123456789" %%I in ("%ComPort%") do set "ComPort="
if "%ComPort%" == "" goto EnterPort
if %ComPort% EQU 0 goto EnterPort
if %ComPort% GTR 255 goto EnterPort
if "%EmptyLine%" == "1" echo.
goto :EOF
我认为,处理HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
是不可取的,因为它列出了所有串行设备,包括例如调制解调器而不仅仅是串行端口。此外,如果设备已知硬件标识符,则可以更快地找到COM端口号,如上所示。
DeviceInstance
标识符通常以递增的数字结尾,以防多个具有相同供应商和产品标识符的设备在不同的USB端口上同时连接。
因此,为了支持在同一台计算机上连接的多个Prolific USB-to-Serial转换器,最好先查询硬件标识符以获取所有设备实例标识符。
以下是ATEN USB转串口桥适配器的一个非常简单的示例:
@echo off
setlocal EnableExtensions
set "HardwareID=VID_0557&PID_2008"
set "RegistryPath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
set "ProductName=ATEN USB to Serial Bridge"
set "DeviceFound=0"
cls
echo.
for /F "delims=" %%I in ('%SystemRoot%\System32\reg.exe QUERY "%RegistryPath%\%HardwareID%" 2^>nul') do call :GetPort "%%I"
if "%DeviceFound%" == "0" echo WARNING: Could not find any %ProductName%.
echo.
endlocal
pause
goto :EOF
:GetPort
set "RegistryKey=%~1"
if /I not "%RegistryKey:~0,71%" == "%RegistryPath%\%HardwareID%\" goto :EOF
for /F "skip=2 tokens=1,3" %%A in ('%SystemRoot%\System32\reg.exe QUERY "%~1\Device Parameters" /v PortName 2^>nul') do (
if /I "%%A" == "PortName" set "SerialPort=%%B" && goto OutputPort
)
goto :EOF
:OutputPort
set "DeviceFound=1"
set "DeviceNumber=%RegistryKey:~-1%"
echo %DeviceNumber%. %ProductName% is %SerialPort%.
goto :EOF
注意:两个批处理代码示例都不会检查每个找到的设备当前是否确实已连接到计算机。这将需要额外的代码,即使使用当前在HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
下注册的值进行交叉检查也是不够的,因为当拔出(虚拟)串行COM端口设备时,此注册表项不会自动更新。只有在插入串行COM端口设备时才会始终更新。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
cls /?
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
reg /?
reg query /?
rem /?
set /?
setlocal /?
shift /?