无忧启动论坛

标题: 为什么一段看起来没有问题的批处理代码运行却出错了?(已解决)) [打印本页]

作者: bjay2008xmy    时间: 2021-6-10 23:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2021-6-10 23:44
给你说的建议你没听啊。

* 缩进
* echo on

作者: bjay2008xmy    时间: 2021-6-10 23:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2021-6-11 00:02
bjay2008xmy 发表于 2021-6-10 23:49
我听了,把echo on打开,再插入pause语句帮助判断错误。不过还是没有找到出错的原因



作者: bjay2008xmy    时间: 2021-6-11 00:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2021-6-11 00:21
本帖最后由 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的分区直接报错。



作者: bjay2008xmy    时间: 2021-6-11 00:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 00:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: 都市浪子666    时间: 2021-6-11 01:48
楼主写批处理的思路改一下,,找到系统分区有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



作者: dos时代菜鸟    时间: 2021-6-11 06:28
不能用 CALL
作者: mdyblog    时间: 2021-6-11 08:27
本帖最后由 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


作者: hilsonma    时间: 2021-6-11 08:35
本帖最后由 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. )
复制代码

作者: mdyblog    时间: 2021-6-11 08:39
也可以:

@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



作者: dos时代菜鸟    时间: 2021-6-11 08:57
已经在另一帖 ,为楼主 做出答案,

作者: hilsonma    时间: 2021-6-11 08: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
复制代码

作者: dos时代菜鸟    时间: 2021-6-11 09:14
本帖最后由 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
复制代码




作者: bjay2008xmy    时间: 2021-6-11 13:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-11 14:14
a换成*,能明白不 还可以换成别的,就是用来标记字符串结尾用的。
作者: hilsonma    时间: 2021-6-11 15:00
bjay2008xmy 发表于 2021-6-11 13:52
你这里有一句我没有看懂。if %xtp%a==a (是什么意思?

当 xtp 是空的,%xtp%a==a 就成立,xtp不是空的就不成立
当找到系统分区时,xtp不是空的,都找不到时,xtp才是空的,这样来判断有没有找到系统分区。
作者: bjay2008xmy    时间: 2021-6-11 15:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 17:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: foxfirefox    时间: 2021-6-11 17:55
代码逻辑有问题:你是想找到 包好windows系统的分区,进行 恢复系统操作。没有系统分区时直接重启,前几天的帖子有回复。 说好了,找到一个windows系统分区就跳出For循环。。。
作者: bjay2008xmy    时间: 2021-6-11 22:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 22:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-12 00:01
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3