无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5816|回复: 32
打印 上一主题 下一主题

为什么一段看起来没有问题的批处理代码运行却出错了?(已解决))

[复制链接]
跳转到指定楼层
1#
发表于 2021-6-10 23:36:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
2#
发表于 2021-6-10 23:44:55 | 只看该作者
给你说的建议你没听啊。

* 缩进
* echo on

点评

我听了,把echo on打开,再插入pause语句帮助判断错误。不过还是没有找到出错的原因  详情 回复 发表于 2021-6-10 23:49
回复

使用道具 举报

3#
 楼主| 发表于 2021-6-10 23:49:32 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

4#
发表于 2021-6-11 00:02:37 | 只看该作者
bjay2008xmy 发表于 2021-6-10 23:49
我听了,把echo on打开,再插入pause语句帮助判断错误。不过还是没有找到出错的原因


点评

这个逻辑感觉有点怪,我写这个模块的时候是想:如果找到那个文件就结束这个for语句的运行。如果没有找到这个文件,就按照for语句内if语句的运行。 最后的结果是找到那个文件它没有结束运行。  详情 回复 发表于 2021-6-11 00:14
回复

使用道具 举报

5#
 楼主| 发表于 2021-6-11 00:14:53 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
发表于 2021-6-11 00:21:53 | 只看该作者
本帖最后由 slore 于 2021-6-11 00:24 编辑
bjay2008xmy 发表于 2021-6-11 00:14
这个逻辑感觉有点怪,我写这个模块的时候是想:如果找到那个文件就结束这个for语句的运行。如果没有找到 ...

你文字描述的逻辑是对的。
但是你的代码不是这个逻辑。

如果找到就结束这个for语句?
那么你的代码应该是下面这样。
if exist %%h\Windows\System32\cmd.exe set found=%%h&&goto For外面的标签

你现在代码就是循环判断每个分区,找到了啥也不干,找不到第一个不存在cmd.exe的分区直接报错。


点评

怪不得很多批处理代码看不懂,原来是我想的跟程序想的不同。可能写批处理需要一定天赋,不然只能一直调试,还只能看运气那种  详情 回复 发表于 2021-6-11 00:36
回复

使用道具 举报

7#
 楼主| 发表于 2021-6-11 00:36:29 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

8#
 楼主| 发表于 2021-6-11 00:39:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

9#
发表于 2021-6-11 01:48:40 | 只看该作者
楼主写批处理的思路改一下,,找到系统分区有CMD.EXE。就跳转出去,没找到就继续FOR。FOR完成之后,还是没找到CMD.EXE 就转到没有找到系统分区




@echo off
for %%h in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: Y: Z:) do (
if  exist %%h\windows\system32\cmd.exe   call :YOU  %%h
)



echo  没有找到系统分区  
echo 按任意键关机
pause>nul
wpeutil shutdown
goto :eof


:YOU
echo 找到系统分区 %1
pause

goto :eof


回复

使用道具 举报

10#
发表于 2021-6-11 06:28:12 来自手机 | 只看该作者
不能用 CALL
回复

使用道具 举报

11#
发表于 2021-6-11 08:27:02 | 只看该作者
本帖最后由 mdyblog 于 2021-6-11 08:31 编辑

试试 :


@echo off
@set s=
for %%h in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: Y: Z:) do @call :checks %%h
@if ""=="%s%" @goto :EOF
::
echo 没有找到系统分区
color 48
echo 按任意键关机
pause>nul
wpeutil shutdown
@goto :EOF


:checks
@if ""=="%s%" if not exist %~1\windows\system32\cmd.exe set s=%~1
@goto :EOF

点评

这个出错了,无论有没有CMD.EXE这个文件,它都提示找不到系统分区  详情 回复 发表于 2021-6-12 00:01
回复

使用道具 举报

12#
发表于 2021-6-11 08:35:04 | 只看该作者
本帖最后由 hilsonma 于 2021-6-11 08:40 编辑

楼主原来代码的意思是:
在各分区查找 \windows\system32\cmd.exe
如果有一个分区找不到该文件就提示/关机/退出查找

如果要所有分区都找不到该文件才提示/关机,那么还是要走完整个for的,不能中途退出,走完for再看查找结果决定下一步的操作,所以代码如下:
  1. @echo off
  2. for %%h in (Z Y X W V U T S R Q P O N M L K J I H G F E D C) do (if exist %%h:\windows\system32\cmd.exe set xtp=%%h)
  3. if %xtp%a==a (
  4.     color 48
  5.     echo 没有找到系统分区
  6.     echo 按任意键关机
  7.     pause>nul
  8.     wpeutil shutdown
  9. )
复制代码

点评

if %xtp%a==a ( color 48 echo 没有找到系统分区 echo 按任意键关机 pause>nul ECHO wpeutil shutdown goto:eof ) 这个语句用的妙,以前从没想过这样用,一加上去就解决了问  详情 回复 发表于 2021-6-11 17:06
你这里有一句我没有看懂。if %xtp%a==a (是什么意思?  详情 回复 发表于 2021-6-11 13:52
回复

使用道具 举报

13#
发表于 2021-6-11 08:39:38 | 只看该作者
也可以:

@echo off
for %%h in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: Y: Z:) do if not exist %%h\windows\system32\cmd.exe goto :END
@goto :EOF
::
:END
echo 没有找到系统分区
color 48
echo 按任意键关机
pause>nul
wpeutil shutdown
@goto :EOF


回复

使用道具 举报

14#
发表于 2021-6-11 08:57:13 | 只看该作者
已经在另一帖 ,为楼主 做出答案,
回复

使用道具 举报

15#
发表于 2021-6-11 08:59:59 | 只看该作者
bjay2008xmy 发表于 2021-6-11 00:39
我只是想增加各分区不存在cmd.exe就关机的功能,怎么改好?
@echo off
color 27

按楼主的意思改了一下代码:

  1. @echo off
  2. for %%j in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (if exist %%j:\systembak.gho set bfp=%%j)
  3. if %bfp%a==a ( set msg="未在各大分区根目录中找到系统映像SYSTEMBAK.GHO,请检查" & call:err & goto:end)
  4. for %%i in (Z Y X W V U T S R Q P O N M L K J I H G F E D C) do (if exist %%i:\windows\system32\cmd.exe set xtp=%%i)
  5. if %xtp%a==a ( set msg="没有找到系统分区" & call:err & goto:end)
  6. call:rst

  7. :end
  8. echo wpeutil shutdown
  9. pause
  10. exit

  11. :err
  12. color 48
  13. echo %msg%
  14. echo 按任意键关机
  15. pause>nul
  16. exit /b

  17. :rst
  18. echo 映像名: %bfp%:\systembak.gho
  19. echo 系统盘为 %xtp%
  20. echo.
  21. echo 接下来把 %bfp%:\systembak.gho 恢复到 %xtp%
  22. echo ghost64.exe -clone,mode=pload,src=%bfp%\systembak.gho:1,dst=%xtp% -sure
  23. echo 恢复系统已完成,准备关机
  24. exit /b
复制代码
回复

使用道具 举报

16#
发表于 2021-6-11 09:14:33 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-6-11 09:16 编辑
  1.     @echo off
  2.     setlocal ENABLEDELAYEDEXPANSION
  3.     color 27
  4.     ECHO 正在使用U盘自动恢复系统,请勿断电和拔下U盘!!!
  5.     ECHO 自动查找分区根目录下的系统映像,等待系统恢复完成后会自动关机。
  6.     ECHO.
  7.     ping 127.1 -n 3 >nul

  8.     set gho_file=systembak.gho
  9.     set find1=0
  10.     set find2=0
  11.     for %%c in (C D E F G H I J K L M N O P Q R S T U V W ) DO (
  12.        IF EXIST %%c:\windows\explorer.exe call :found1 %%c
  13.        if exist %%c:\!gho_file! call :found2 %%c
  14.     )

  15.     if !find1! equ 0 (
  16.        echo 未找到 windows 分区
  17.        call :error1
  18.     )
  19.     if !find2! equ 0 (
  20.        echo 未找到 GHO 文件
  21.        call :error1
  22.     )

  23.     ECHO.
  24.     ECHO 接下来把!find2!:\systembak.gho恢复到!find1!:
  25.     ghost64.exe -clone,mode=pload,src=!find2!:\systembak.gho:1,dst=!find1!: -sure
  26.     ECHO 恢复系统已完成,准备关机
  27.     wpeutil shutdown

  28.     GOTO :EOF


  29.     :found1
  30.        set find1=%1
  31.        echo 找到 windows 分区 %1:
  32.     exit /b

  33.     :found2
  34.        set find2=%1
  35.        echo 找到 GHO 文件 %1:\!gho_file!
  36.     exit /b

  37.     :error1
  38.        color 48
  39.        echo 按任意键关机
  40.        pause>nul
  41.        wpeutil shutdown
  42.     exit /b
复制代码



点评

这个才是合格的.当然还可以加入多分区多镜像选择.  发表于 2021-6-11 10:56
回复

使用道具 举报

17#
 楼主| 发表于 2021-6-11 13:52:07 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

18#
发表于 2021-6-11 14:14:43 来自手机 | 只看该作者
a换成*,能明白不 还可以换成别的,就是用来标记字符串结尾用的。
回复

使用道具 举报

19#
发表于 2021-6-11 15:00:16 | 只看该作者
bjay2008xmy 发表于 2021-6-11 13:52
你这里有一句我没有看懂。if %xtp%a==a (是什么意思?

当 xtp 是空的,%xtp%a==a 就成立,xtp不是空的就不成立
当找到系统分区时,xtp不是空的,都找不到时,xtp才是空的,这样来判断有没有找到系统分区。

点评

判断 %xtp%a是否等于a我看的懂,不过%xtp%a这种写法我是第一见  详情 回复 发表于 2021-6-11 15:18
回复

使用道具 举报

20#
 楼主| 发表于 2021-6-11 15:18:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

21#
 楼主| 发表于 2021-6-11 17:06:44 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

22#
发表于 2021-6-11 17:55:01 | 只看该作者
代码逻辑有问题:你是想找到 包好windows系统的分区,进行 恢复系统操作。没有系统分区时直接重启,前几天的帖子有回复。 说好了,找到一个windows系统分区就跳出For循环。。。

点评

感谢大佬。已有简单易行的方案了,hilsonma提供的方案我只需要在原有的代码中插入如下代码就可以了: if %xtp%a==a ( color 48 echo 没有找到系统分区 echo 按任意键关机 pause>nul wpeut  详情 回复 发表于 2021-6-11 22:03
回复

使用道具 举报

23#
 楼主| 发表于 2021-6-11 22:01:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

24#
 楼主| 发表于 2021-6-11 22:03:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

25#
 楼主| 发表于 2021-6-12 00:01:13 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-26 06:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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