Batch file 如何从查询中检索serialcomm?
我目前正在学习如何创建批处理脚本,但到目前为止我只做查询。我能够在以下注册表路径上获得当前硬件、设备映射和串行com的列表Batch file 如何从查询中检索serialcomm?,batch-file,Batch File,我目前正在学习如何创建批处理脚本,但到目前为止我只做查询。我能够在以下注册表路径上获得当前硬件、设备映射和串行com的列表 HKLM\hardware\devicemap\serialcomm 问题是每台计算机在同一台设备上显示不同的serialcomm。因此,我试图根据设备名称捕获serialcomm 我的当前代码如下: reg query HKLM\hardware\devicemap\serialcomm pause 下面是一个更新的代码,我试图根据硬件名称获取serialcomm,但
HKLM\hardware\devicemap\serialcomm
问题是每台计算机在同一台设备上显示不同的serialcomm
。因此,我试图根据设备名称捕获serialcomm
我的当前代码如下:
reg query HKLM\hardware\devicemap\serialcomm
pause
下面是一个更新的代码,我试图根据硬件名称获取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
我的计算机上没有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
您应该将要查找的特定值作为参数传递给批处理文件。例如,如果批处理文件名为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
您应该将要查找的特定值作为参数传递给批处理文件。例如,如果批处理文件名为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
这是一个批处理代码,其中包含一些解释性注释,我在几周前编写了该批处理代码,使用mySmartUSB MK2通过批处理文件对Atmel AVR控制器进行编程,在安装了设备驱动程序后,该批处理文件将作为虚拟串行通信端口安装。用于对AVR控制器的保险丝位、闪存和eeprom进行编程的代码部分已被替换这里是一个简单的信息消息 批处理文件确定COM端口号
DeviceInstance
、HardwareID
和ProductName
必须适合于丰富的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
使用Windows注册表编辑器查看注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
用于多产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端口上
因此,为了支持连接在同一台计算机上的多个丰富的USB到串行转换器,最好先查询硬件标识符,以获取所有设备实例标识符
下面是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
下注册的值进行交叉检查也不够,因为在n已拔出(虚拟)串行COM端口设备。仅当串行COM端口设备插入时,才会始终更新该设备
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
呼叫/?
cls/?
echo/?
endlocal/?
获取/?
goto/?
如果/?
暂停/?
reg/?
reg query/?
rem/?
设置/?
setlocal/?
shift/?