Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何从查询中检索serialcomm?_Batch File - Fatal编程技术网

Batch file 如何从查询中检索serialcomm?

Batch file 如何从查询中检索serialcomm?,batch-file,Batch File,我目前正在学习如何创建批处理脚本,但到目前为止我只做查询。我能够在以下注册表路径上获得当前硬件、设备映射和串行com的列表 HKLM\hardware\devicemap\serialcomm 问题是每台计算机在同一台设备上显示不同的serialcomm。因此,我试图根据设备名称捕获serialcomm 我的当前代码如下: reg query HKLM\hardware\devicemap\serialcomm pause 下面是一个更新的代码,我试图根据硬件名称获取serialcomm,但

我目前正在学习如何创建批处理脚本,但到目前为止我只做查询。我能够在以下注册表路径上获得当前硬件、设备映射和串行com的列表

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端口号

  • 从多个可选命令行参数(特殊选项)中选择一个,或
  • 直接从Windows注册表(默认方法)自动查询,或
  • 向批处理文件的用户询问端口号(故障保护方法)
  • 对于这个问题,来自Windows注册表的标识是最有趣的部分

    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/?

    这是一个批处理代码,其中包含一些解释性注释。几周前,我编写了一个批处理文件,使用mySmartUSB MK2作为虚拟串行通信端口对Atmel AVR控制器进行编程。安装了设备驱动程序后,用于对AVR控制器的保险丝位、闪存和eeprom进行编程的代码部分是rep这里有一条简单的信息

    批处理文件确定COM端口号

  • 从其中一个