标题: [系统相关] 批处理报错“对 SETLOCAL 命令来说参数是无效的”是什么原因 [打印本页]
作者: liumtz 时间: 2016-11-3 18:31 标题: 批处理报错“对 SETLOCAL 命令来说参数是无效的”是什么原因
本帖最后由 pcl_test 于 2016-11-3 19:51 编辑
- @echo off
-
- echo ◇◇◇◇◇◇◇◇◇◇
-
- setlocal enabledelayedexpansioon
-
- for %%i in (nvsvc,eventlog) do (
-
- set exePath=
- for /f "skip=1 delims=" %%a in ('wmic service where Name^="%%i" get PathName') do (
- set exePath=%%a
- )
- echo !exePath!
- echo ◇"!exePath!"◇
- pause
- if defined exePath (
- if not "!exePath!"=="" call :lis !exePath!
- ))
- goto end
- :lis
- ... ...
复制代码
CMD窗口显示:
◇◇◇◇◇◇◇◇◇◇
对 SETLOCAL 命令来说参数是无效的。
!exePath!
◇"!exePath!"◇
请按任意键继续. . .
请各位帮忙分析,谢谢!
作者: liumtz 时间: 2016-11-3 18:59
pcl_test
第一次使用setlocal enabledelayedexpansioon,,,不知道是啥情况,请前辈指教啊!
作者: pcl_test 时间: 2016-11-3 19:58
回复 2# liumtz
如何查看某个命令的用法和帮助信息,在cmd窗口输入命令 /?或help 命令后按回车键,如在cmd窗口输入setlocal /?后按回车键
……
如果命令扩展被启用,setlocal 会如下改变:
setlocal 批命令现在可以接受可选参数:
enableextensions / disableextensions
启用或禁用命令处理器扩展。这些
参数比 cmd /en 或 /e:off
开关有优先权。请参阅 cmd /? 获取详细信息。
enabledelayedexpansion / disabledelayedexpansion
启用或禁用延缓环境变量
扩展。这些参数比 cmd
/v:on 或 /v:off 开关有优先权。请参阅 cmd /? 获取详细信息。
……
作者: terse 时间: 2016-11-3 20:25
回复 1# liumtz
貌似多打一个o 你去掉一个试
作者: GNU 时间: 2016-11-3 21:38
setlocal enabledelayedexpansioon
单词拼写错误
建议使用支持语法高亮的编辑器
作者: aa77dd@163.com 时间: 2016-11-3 21:54
回复 1# liumtz
楼主请学会用 pause 做断点, echo on 开回显, echo %var%, set var, rem 怀疑有问题的代码段, ... 这些是基本的批处理调试技能
还有请记住, 我们写任何代码时, 发生得最多的错误, 都是我们自己的错误, 由系统或者语言 BUG 造成的错误只是很小的一部分
作者: liumtz 时间: 2016-11-3 22:44
回复 3# pcl_test
谢谢提醒!
作者: liumtz 时间: 2016-11-3 22:45
回复 liumtz
貌似多打一个o 你去掉一个试
terse 发表于 2016-11-3 20:25
谢谢提醒!确实是这个问题!
作者: liumtz 时间: 2016-11-3 22:50
本帖最后由 liumtz 于 2016-11-3 22:59 编辑
回复 liumtz
楼主请学会用 pause 做断点, echo on 开回显, echo %var%, set var, rem 怀疑有问题的代 ...
aa77dd@163.com 发表于 2016-11-3 21:54
是拼写错误导致的,可是问题又来了,请看下面的代码,按下任意键CMD窗口就消失了,是if defined exe那里有问题吗?帮忙调试下,谢谢!- @echo off
-
- echo ◇◇◇◇◇◇◇◇◇◇
-
- ::Distribuobj,Distribuxwc
- ::reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs" /v lpk /t REG_SZ /d "lpk.dll" /f > nul
- ::sc config Distribuobj start= disabled > nul
- ::net stop Distribuobj > nul
-
- setlocal enabledelayedexpansion
-
- for %%i in (spooler,eventlog) do (
-
- set exePath=
- for /f "skip=1 delims=" %%a in ('wmic service where Name^="%%i" get PathName') do (
- set exePath=%%a
- )
- echo !exePath!
- echo ◇"!exePath!"◇
- if defined exePath (
- if not "!exePath!"=="" call :lis !exePath!
- ))
-
- ::endlocal
-
- goto end
-
-
- :lis
- echo "%*"
- set exe=
- for /f "delims=" %%b in ('echo %*^|findstr /r /i "^%SystemDrive%\\windows\\system32\\.*\.exe$"') do (
- set exe=%%b
- )
- echo ☆"%exe%"☆
- pause
- if defined exe (
- echo 断点1
- if not "%exe%"==""(
- echo 断点2
- ::if not exist %exe%\ del /f /q %exe%
- ::sc delete Distribuobj
- ))
- goto :eof
-
- echo ☆☆☆☆☆☆☆☆☆☆☆
-
- :end
- echo.
- echo.
- echo LPK已清除完毕,请现在重启电脑,重启后免疫将生效
- echo.
- echo.
- echo ---------------------请按任意键退出该程序或直接关闭此窗口--------------------
- pause>nul
复制代码
作者: pcl_test 时间: 2016-11-3 23:05
回复 9# liumtz
批处理调试方法,把echo off改为echo on,打开cmd窗口,把批处理文件拖进cmd窗口,按回车键运行
作者: aa77dd@163.com 时间: 2016-11-3 23:09
本帖最后由 aa77dd@163.com 于 2016-11-3 23:13 编辑
回复 9# liumtz
楼主你要学的还有细心, 编写代码要有好的编辑习惯, 缩进格式是最基本的, 不细心的习惯: 常拼写错误, 空格一下有, 一下没有; 标签冒号一下有, 一下没有? 如果 CMD 解释器能说话, 它只会对你说: 我已经崩溃了!
你的代码为什么没有缩进格式?
if 后的复合语句前的左括号前 要 有 空格- @echo off
-
- echo ◇◇◇◇◇◇◇◇◇◇
-
- ::Distribuobj,Distribuxwc
- ::reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs" /v lpk /t REG_SZ /d "lpk.dll" /f > nul
- ::sc config Distribuobj start= disabled > nul
- ::net stop Distribuobj > nul
-
- setlocal enabledelayedexpansion
-
- for %%i in (spooler,eventlog) do (
-
- set exePath=
- for /f "skip=1 delims=" %%a in ('wmic service where Name^="%%i" get PathName') do (
- set exePath=%%a
- )
- echo [!exePath!]
- echo;WatchPoint 20161103_230545
- set exePath
- echo ◇"!exePath!"◇
- if defined exePath (
- if not "!exePath!"=="" call :lis !exePath!
- )
- )
-
- ::endlocal
-
- goto :end
-
-
- :lis
- echo "%*"
- set exe=
- for /f "delims=" %%b in ('echo %*^|findstr /r /i "^%SystemDrive%\\windows\\system32\\.*\.exe$"') do (
- set exe=%%b
- )
- echo ☆"%exe%"☆
- set exePath
- pause
- if defined exePath (
- echo 断点1
- if not "%exe%"=="" (
- echo 断点2
- ::if not exist %exe%\ del /f /q %exe%
- ::sc delete Distribuobj
- )
- )
- pause
- goto :eof
-
- echo ☆☆☆☆☆☆☆☆☆☆☆
-
- :end
- echo.
- echo.
- echo LPK已清除完毕,请现在重启电脑,重启后免疫将生效
- echo.
- echo.
- echo ---------------------请按任意键退出该程序或直接关闭此窗口--------------------
- pause>nul
复制代码
作者: liumtz 时间: 2016-11-3 23:14
奇怪了,我去掉
if defined exe (
echo 断点1
if not "%exe%"==""(
echo 断点2
::if not exist %exe%\ del /f /q %exe%
::sc delete Distribuobj
))
这几行就可以执行下去,并执行到了最后一行(这些代码要在XP下测试,win7下好像wmic不兼容)
以下是CMD上显示的信息:
◇◇◇◇◇◇◇◇◇◇
C:\WINDOWS\system32\spoolsv.exe
"◇C:\WINDOWS\system32\spoolsv.exe
"C:\WINDOWS\system32\spoolsv.exe"
☆"C:\WINDOWS\system32\spoolsv.exe"☆
请按任意键继续. . .
C:\WINDOWS\system32\services.exe
"◇C:\WINDOWS\system32\services.exe
"C:\WINDOWS\system32\services.exe"
☆"C:\WINDOWS\system32\services.exe"☆
请按任意键继续. . .
LPK已清除完毕,请现在重启电脑,重启后免疫将生效
---------------------请按任意键退出该程序或直接关闭此窗口--------------------
作者: liumtz 时间: 2016-11-3 23:22
回复 10# pcl_test
OK
作者: liumtz 时间: 2016-11-3 23:23
本帖最后由 liumtz 于 2016-11-3 23:27 编辑
回复 liumtz
楼主你要学的还有细心, 编写代码要有好的编辑习惯, 缩进格式是最基本的, 不细心的习惯: 常 ...
aa77dd@163.com 发表于 2016-11-3 23:09
好的,我一直用记事本写代码,因为是业余,偶尔有需求才研究研究,请问用什么代码编辑器好呢?轻量级的,Notepad++怎么样?
作者: aa77dd@163.com 时间: 2016-11-3 23:28
本帖最后由 aa77dd@163.com 于 2016-11-3 23:30 编辑
回复 14# liumtz
好编辑器不少
Notepad++ 不错
另外, 好象并没有人以写批处理代码为职业
作者: aa77dd@163.com 时间: 2016-11-3 23:39
回复 12# liumtz
wmic 的输出中, 行结束符可能并不是你想象的情形, 你可以把输出重定向到文件, 看看具体情况
Notepad++ 可以显示不可打印的 ASCII 字符, 包括单个的 CR 或者 LF
有许多命令在 XP 和 WIN7 的表现会有细节的差异, 想要两种环境下都兼容的, 调试时就先想想是不是某命令在两种环境下的差异造成了问题
作者: WHY 时间: 2016-11-3 23:56
回复 12# liumtz
并非 WMIC 不兼容 win7, 是你的方法不对。另外,语句块中注释应该用 rem- @echo off
- for /f "delims=" %%a in ('wmic service where "Name='spooler' or Name='eventlog'" get PathName ^| find "\"') do (
- call :lis "%%a"
- )
- pause & exit
-
- :lis
- echo;[%~f1]
复制代码
作者: liumtz 时间: 2016-11-4 00:07
本帖最后由 liumtz 于 2016-11-4 00:11 编辑
回复 16# aa77dd@163.com
好的,我用了一下Notepad++,五颜六色,眼花= =。。。看来得慢慢习惯代码编辑器了,我发现批处理真的很难写,太不灵活了。刚才的代码又遇到一个问题,执行到echo 断点2后面,CMD会显示系统找不到指定的驱动器。,我把后面两句带注释的行删掉就不会有这个提示了。可是后面是两句加了注释的行啊,貌似还是会执行?
::if not exist %exe%\ del /f /q %exe%
::sc delete Distribuobj
以下是CMD显示的信息:
◇◇◇◇◇◇◇◇◇◇
C:\WINDOWS\system32\spoolsv.exe
"◇C:\WINDOWS\system32\spoolsv.exe
"C:\WINDOWS\system32\spoolsv.exe"
☆"C:\WINDOWS\system32\spoolsv.exe"☆
exePath=C:\WINDOWS\system32\spoolsv.exe
请按任意键继续. . .
断点1
断点2
系统找不到指定的驱动器。
C:\WINDOWS\system32\services.exe
"◇C:\WINDOWS\system32\services.exe
"C:\WINDOWS\system32\services.exe"
☆"C:\WINDOWS\system32\services.exe"☆
exePath=C:\WINDOWS\system32\services.exe
请按任意键继续. . .
断点1
断点2
系统找不到指定的驱动器。
LPK已清除完毕,请现在重启电脑,重启后免疫将生效
---------------------请按任意键退出该程序或直接关闭此窗口--------------------
作者: liumtz 时间: 2016-11-4 00:13
本帖最后由 liumtz 于 2016-11-4 00:46 编辑
回复 17# WHY
语句块中没有使用REM注释才导致出现:系统找不到指定的驱动器。 试了下果然是这个原因,另外你给出的有关WMIC的代码很简洁高效,多谢!
作者: aa77dd@163.com 时间: 2016-11-4 00:24
楼主看过 ntcmds.chm
没有,没有就开始看,
:: 不是注释头, 只是标签语法符号的异用
作者: aa77dd@163.com 时间: 2016-11-4 00:38
回复 18# liumtz
程序设计语言用的精确语言范式,批处理作为一种胶水语言,相对高级语言[比如PASCAL],其语法范式的规范性差远了,和你认为的正相反,胶水语言通常都是灵活的,灵活的代价有可能牺牲规范性,统一性,微软官方既不开源,又没有给出很深入很完整的语言规范文档--这个造成批处理编写上的一些困难
作者: liumtz 时间: 2016-11-4 00:47
回复 20# aa77dd@163.com
确实没看过 - -
作者: liumtz 时间: 2016-11-4 00:50
回复 21# aa77dd@163.com
是啊,批处理越深入越觉得变态,有点莫名其妙,还是javascript好理解。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |