ABC2Z 发表于 2024-11-2 23:53

批处理诡异的注释出错

无聊,因为洁癖的缘故,写了一个批处理根据设备 实例ID 卸载并删除第三方驱动程序,准备将来再扩充成一个卸载再安装新驱动程序的批处理,结果测试的时候遇到一个诡异的注释错误。
先贴代码:
@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c call ""%~0"" ::",,"runas",1)(Window.Close)&exit

:runas
pushd %~dp0
setlocal enabledelayedexpansion

:: 指定设备实例ID
set Instance_IDs="PCI\VEN_8086&DEV_08B2&SUBSYS_C2708086&REV_83\4&3519D99C&0&00E1"

:: 临时文件存储 pnputil 的输出
set Temp_File="%TEMP%\pnputil_output.txt"

:: 枚举设备并输出到临时文件
pnputil /enum-devices /instanceid %Instance_IDs% > %Temp_File%

:: 读取 pnputil_output.txt 并提取 Inf 文件名
for /f "tokens=2 delims=: " %%i in ('findstr /i /e ".inf" %Temp_File%') do set Inf_File=%%i

:: 检查是否找到 oem 格式的 Inf 文件名
if "%Inf_File:~0,3%" == "oem" (
    echo Locate the Inf file corresponding to the device instanceid %Instance_IDs%: %Inf_File%.
    :: 禁用设备 下一句不能用双冒号注释,只能用 REM 注释,Windows 的问题
    :: pnputil /disable-device %Instance_IDs%
    :: 卸载并删除驱动程序
    pnputil /delete-driver %Inf_File% /uninstall /force
    if %errorlevel% equ 0 (
      echo Successfully uninstall Inf filename %Inf_File% drives.
    ) else (
      echo Uninstall the Inf filename %Inf_File% There was an error while driving.
    )
) else (
    echo The Inf file for device instanceid %Instance_IDs% was not found.
)

pnputil /add-driver netwbw02.inf /install

:: 清理临时文件
del %Temp_File%

endlocal
pause
诡异的地方出现在 :: pnputil /disable-device %Instance_IDs% 这一行(第24行),其实不需要禁止设备,当时写了代码,后来就加了注释,然后测试就发现出现提示 “系统找不到指定的驱动器。”
哎呀!怎么会出现这样的提示呢?排查之下,把这双冒号的注释改成 REM,提示消失不再出现。

拉拉姬 发表于 2024-11-3 10:22

批处理脚本看着就想吐,这语法这辈子记不住。

wcb0414 发表于 2024-11-3 11:01

IF 里的用REM注释

ABC2Z 发表于 2024-11-3 11:10

wcb0414 发表于 2024-11-3 11:01 https://i.pcbeta.com/static/image/common/back.gif
IF 里的用REM注释

我测试过了,IF 里只是某些双冒号注释才会出错,所以觉得怪异。

ananhaid 发表于 2024-11-3 11:12

::按理说属于不正式用法,用 REM 是正式的注释方法。

ABC2Z 发表于 2024-11-3 11:27

ananhaid 发表于 2024-11-3 11:12 https://i.pcbeta.com/static/image/common/back.gif
::按理说属于不正式用法,用 REM 是正式的注释方法。

说得对。我又搜索阅读了一些文章,许多文章都说 括号 ( ) 不要用双冒号做注释,可能会导致解释出错。

yj070 发表于 2024-11-3 11:28

楼上几位说得对,用Rem注释,::注释在if和for循环中会报错,我以前也遇到过,后面就改成用Rem了。

ABC2Z 发表于 2024-11-3 11:29

拉拉姬 发表于 2024-11-3 10:22 https://i.pcbeta.com/static/image/common/back.gif
批处理脚本看着就想吐,这语法这辈子记不住。

我也只会些简单的,像那个什么 Microsoft Activation Scripts 工具,太复杂了,看了就头大

hnfeng 发表于 2024-11-3 11:52

for 和 if 里面不能使用标签(可以往外跳转)
两个 冒号 的更不能使用

hnfeng 发表于 2024-11-3 11:55

for 和 if 的 (   )之间 在批处理运行时,是作为一行命令来解释的,一次性读入内存来运行的
所以无法有 冒号开始的标签,两个冒号也不能用

ABC2Z 发表于 2024-11-3 14:49

hnfeng 发表于 2024-11-3 11:55 https://i.pcbeta.com/static/image/common/back.gif
for 和 if 的 (   )之间 在批处理运行时,是作为一行命令来解释的,一次性读入内存来运行的
所以无法有...

我测试过三个连续冒号然后通过了。这其实也算是Windows的批处理解释程序的健壮性不够了
页: [1]
查看完整版本: 批处理诡异的注释出错