找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 84052|回复: 22

[系统相关] 批处理报错“对 SETLOCAL 命令来说参数是无效的”是什么原因

[复制链接]
发表于 2016-11-3 18:31:02 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-11-3 19:51 编辑

  1. @echo off

  2. echo ◇◇◇◇◇◇◇◇◇◇

  3. setlocal enabledelayedexpansioon

  4. for %%i in (nvsvc,eventlog) do (

  5. set exePath=
  6. for /f "skip=1 delims=" %%a in ('wmic service where Name^="%%i" get PathName') do (
  7. set exePath=%%a
  8. )
  9. echo !exePath!
  10. echo ◇"!exePath!"◇
  11. pause
  12. if defined exePath (
  13. if not "!exePath!"=="" call :lis !exePath!
  14. ))
  15. goto end
  16. :lis
  17. ... ...
复制代码
CMD窗口显示:
◇◇◇◇◇◇◇◇◇◇
对 SETLOCAL 命令来说参数是无效的。
!exePath!
◇"!exePath!"◇
请按任意键继续. . .

请各位帮忙分析,谢谢!

评分

参与人数 1PB -2 收起 理由
pcl_test -2 低级错误先自查

查看全部评分

 楼主| 发表于 2016-11-3 18:59:19 | 显示全部楼层
pcl_test
            第一次使用setlocal enabledelayedexpansioon,,,不知道是啥情况,请前辈指教啊!
发表于 2016-11-3 19:58:29 | 显示全部楼层
回复 2# liumtz

如何查看某个命令的用法和帮助信息,在cmd窗口输入命令 /?或help 命令后按回车键,如在cmd窗口输入setlocal /?后按回车键

……
如果命令扩展被启用,setlocal 会如下改变:

setlocal 批命令现在可以接受可选参数:
        enableextensions / disableextensions
            启用或禁用命令处理器扩展。这些
            参数比 cmd /en 或 /e:off
            开关有优先权。请参阅 cmd /? 获取详细信息。
        enabledelayedexpansion / disabledelayedexpansion
            启用或禁用延缓环境变量
            扩展。这些参数比 cmd
            /v:on 或 /v:off 开关有优先权。请参阅 cmd /? 获取详细信息。
……
发表于 2016-11-3 20:25:12 | 显示全部楼层
回复 1# liumtz
貌似多打一个o 你去掉一个试
发表于 2016-11-3 21:38:27 | 显示全部楼层
setlocal enabledelayedexpansioon
单词拼写错误
建议使用支持语法高亮的编辑器
发表于 2016-11-3 21:54:40 | 显示全部楼层
回复 1# liumtz

楼主请学会用 pause 做断点, echo on 开回显, echo %var%,  set var,  rem 怀疑有问题的代码段, ...   这些是基本的批处理调试技能

还有请记住, 我们写任何代码时, 发生得最多的错误, 都是我们自己的错误, 由系统或者语言 BUG 造成的错误只是很小的一部分
 楼主| 发表于 2016-11-3 22:44:54 | 显示全部楼层
回复 3# pcl_test


    谢谢提醒!
 楼主| 发表于 2016-11-3 22:45:23 | 显示全部楼层
回复  liumtz
貌似多打一个o 你去掉一个试
terse 发表于 2016-11-3 20:25



      谢谢提醒!确实是这个问题!
 楼主| 发表于 2016-11-3 22:50:46 | 显示全部楼层
本帖最后由 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那里有问题吗?帮忙调试下,谢谢!
  1. @echo off

  2. echo ◇◇◇◇◇◇◇◇◇◇

  3. ::Distribuobj,Distribuxwc
  4. ::reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs" /v lpk /t REG_SZ /d "lpk.dll" /f > nul
  5. ::sc config Distribuobj start= disabled > nul
  6. ::net stop Distribuobj > nul

  7. setlocal enabledelayedexpansion

  8. for %%i in (spooler,eventlog) do (

  9. set exePath=
  10. for /f "skip=1 delims=" %%a in ('wmic service where Name^="%%i" get PathName') do (
  11. set exePath=%%a
  12. )
  13. echo !exePath!
  14. echo ◇"!exePath!"◇
  15. if defined exePath (
  16. if not "!exePath!"=="" call :lis !exePath!
  17. ))

  18. ::endlocal

  19. goto end


  20. :lis
  21. echo "%*"
  22. set exe=
  23. for /f "delims=" %%b in ('echo %*^|findstr /r /i "^%SystemDrive%\\windows\\system32\\.*\.exe$"') do (
  24. set exe=%%b
  25. )
  26. echo ☆"%exe%"☆
  27. pause
  28. if defined exe (
  29. echo 断点1
  30. if not "%exe%"==""(
  31. echo 断点2
  32. ::if not exist %exe%\ del /f /q %exe%
  33. ::sc delete Distribuobj
  34. ))
  35. goto :eof

  36. echo ☆☆☆☆☆☆☆☆☆☆☆

  37. :end
  38. echo.
  39. echo.
  40. echo  LPK已清除完毕,请现在重启电脑,重启后免疫将生效
  41. echo.
  42. echo.
  43. echo ---------------------请按任意键退出该程序或直接关闭此窗口--------------------
  44. pause>nul
复制代码

评分

参与人数 1PB -4 收起 理由
pcl_test -4 未按版规发帖

查看全部评分

发表于 2016-11-3 23:05:46 | 显示全部楼层
回复 9# liumtz

批处理调试方法,把echo off改为echo on,打开cmd窗口,把批处理文件拖进cmd窗口,按回车键运行
发表于 2016-11-3 23:09:43 | 显示全部楼层
本帖最后由 aa77dd@163.com 于 2016-11-3 23:13 编辑

回复 9# liumtz

楼主你要学的还有细心, 编写代码要有好的编辑习惯, 缩进格式是最基本的, 不细心的习惯: 常拼写错误, 空格一下有, 一下没有; 标签冒号一下有, 一下没有? 如果 CMD 解释器能说话, 它只会对你说: 我已经崩溃了!

你的代码为什么没有缩进格式?

if 后的复合语句前的左括号前 要 有 空格
  1. @echo off

  2. echo ◇◇◇◇◇◇◇◇◇◇

  3. ::Distribuobj,Distribuxwc
  4. ::reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs" /v lpk /t REG_SZ /d "lpk.dll" /f > nul
  5. ::sc config Distribuobj start= disabled > nul
  6. ::net stop Distribuobj > nul

  7. setlocal enabledelayedexpansion

  8. for %%i in (spooler,eventlog) do (

  9.     set exePath=
  10.     for /f "skip=1 delims=" %%a in ('wmic service where Name^="%%i" get PathName') do (
  11.         set exePath=%%a
  12.     )
  13.     echo [!exePath!]
  14.     echo;WatchPoint 20161103_230545
  15.     set exePath
  16.     echo ◇"!exePath!"◇
  17.     if defined exePath (
  18.         if not "!exePath!"=="" call :lis !exePath!
  19.     )
  20. )

  21. ::endlocal

  22. goto :end


  23. :lis
  24. echo "%*"
  25. set exe=
  26. for /f "delims=" %%b in ('echo %*^|findstr /r /i "^%SystemDrive%\\windows\\system32\\.*\.exe$"') do (
  27.     set exe=%%b
  28. )
  29. echo ☆"%exe%"☆
  30. set exePath
  31. pause
  32. if defined exePath (
  33.     echo 断点1
  34.     if not "%exe%"=="" (
  35.         echo 断点2
  36.         ::if not exist %exe%\ del /f /q %exe%
  37.         ::sc delete Distribuobj
  38.     )
  39. )
  40. pause
  41. goto :eof

  42. echo ☆☆☆☆☆☆☆☆☆☆☆

  43. :end
  44. echo.
  45. echo.
  46. echo  LPK已清除完毕,请现在重启电脑,重启后免疫将生效
  47. echo.
  48. echo.
  49. echo ---------------------请按任意键退出该程序或直接关闭此窗口--------------------
  50. pause>nul
复制代码
 楼主| 发表于 2016-11-3 23:14:55 | 显示全部楼层
奇怪了,我去掉
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已清除完毕,请现在重启电脑,重启后免疫将生效


---------------------请按任意键退出该程序或直接关闭此窗口--------------------
 楼主| 发表于 2016-11-3 23:22:19 | 显示全部楼层
回复 10# pcl_test


    OK
 楼主| 发表于 2016-11-3 23:23:41 | 显示全部楼层
本帖最后由 liumtz 于 2016-11-3 23:27 编辑
回复  liumtz

楼主你要学的还有细心, 编写代码要有好的编辑习惯, 缩进格式是最基本的, 不细心的习惯: 常 ...
aa77dd@163.com 发表于 2016-11-3 23:09



    好的,我一直用记事本写代码,因为是业余,偶尔有需求才研究研究,请问用什么代码编辑器好呢?轻量级的,Notepad++怎么样?

评分

参与人数 1PB -2 收起 理由
pcl_test -2 指定回应某楼层的在相应楼层点回复,少引用

查看全部评分

发表于 2016-11-3 23:28:57 | 显示全部楼层
本帖最后由 aa77dd@163.com 于 2016-11-3 23:30 编辑

回复 14# liumtz

好编辑器不少
Notepad++ 不错

另外, 好象并没有人以写批处理代码为职业
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:25 , Processed in 0.034853 second(s), 14 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表