无忧启动论坛

标题: 写了好几天的批处理文档,眼睛都看近视了,这会应该没错了吧(已解决) [打印本页]

作者: bjay2008xmy    时间: 2021-6-10 13:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: 邪恶海盗    时间: 2021-6-10 14:04
别的不说,查找系统分区命令我感觉不严谨,毕竟硬盘分区不一定只有二十多个...
作者: bjay2008xmy    时间: 2021-6-10 14:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: conlin888    时间: 2021-6-10 14:48
建议远离脚本和代码,可以多活好几年, 至少头发不会掉那么快
作者: 2012jiashanni    时间: 2021-6-10 15:00
双系统下或者PE下 这不就瘫了吗
作者: bjay2008xmy    时间: 2021-6-10 15:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-10 15:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: 2012jiashanni    时间: 2021-6-10 15:39
我敢断定这段代码在 永远不会关机 而且在硬盘无系统情况下 还会搜索到系统 你猜是因为啥
::查找系统分区,未找到就关机
for %%h 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 (
作者: captain_g    时间: 2021-6-10 15:40
不少PE可能根本就不能PING;

这一句ping 127.1 -n 3 >nul就这行不了,提示出错;

前面回显的可能根本看不见.....

作者: bjay2008xmy    时间: 2021-6-10 16:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-10 16:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-10 16:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: captain_g    时间: 2021-6-10 16:35
bjay2008xmy 发表于 2021-6-10 16:27
听听大佬的意见

PE占用什么盘符,难道是A或B?应该排除掉啊

作者: bjay2008xmy    时间: 2021-6-10 16:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: mrzhonghb    时间: 2021-6-10 18:05
建议楼主分享整套完整方案 使用方法 及注意事项,让大家测试一下。
作者: 2012jiashanni    时间: 2021-6-10 18:33
bjay2008xmy 发表于 2021-6-10 16:43
PE一般用的是X盘,顿时感觉惊恐了

哈哈哈哈哈哈哈哈哈哈或或或或  你终于反应过来了
作者: plusv    时间: 2021-6-10 19:37
bjay2008xmy 发表于 2021-6-10 14:46
你有更好的办法吗?两个字母的盘符我没有见过,要写可以加一个for命令嵌套

>你有更好的办法吗?两个字母的盘符我没有见过,要写可以加一个for命令嵌套




作者: ESD    时间: 2021-6-10 20:22
这个的应用场景在哪里?
作者: bjay2008xmy    时间: 2021-6-10 20:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-10 20:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-10 21:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-10 21:59
很久没用 ghost 了
其实 ghost 套系中有两个工具
gdisk 用来分区
omnifs 用来查找和操作分区中的文件

分区不一定要有盘符,只要 用 ghost 可识别的 1:2 2:1 之类的表示即可。

所以,我建议用 omnifs 获取分区信息并确定 存在指定文件的 分区,并确定 要回复的分区。
然后的事情就交给 ghost 办理了。

之前 这类操作都是 在 dos 下完成的。
自从有了 wim 打包方式 和 查分vhd 的概念,我很少用 ghost 来回复和安装系统了。
作者: bjay2008xmy    时间: 2021-6-10 22:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-10 23:01
bjay2008xmy 发表于 2021-6-10 22:09
我觉得对我来说,它们都只是一个工具,用哪个不重要,只要能做到我想做的事就可以了。

刚才我在PE中去 ...

系统分区未被分配盘符或者 系统没有你要找的文件,为啥不直接用 windows 目录来确认呢?
作者: dos时代菜鸟    时间: 2021-6-10 23:07
本帖最后由 dos时代菜鸟 于 2021-6-10 23:51 编辑

用这个 直接找出 系统分区和 gho 位置
不管 分区是否隐藏,甚至是 linux 分区上的 gho 估计也能识别出来。

在64位 win7 win10 下测试通过


omnifs64_script-2.7z (1.04 MB, 下载次数: 98)


作者: bjay2008xmy    时间: 2021-6-10 23:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-10 23:48
本帖最后由 dos时代菜鸟 于 2021-6-10 23:49 编辑
bjay2008xmy 发表于 2021-6-10 23:23
并非存在“系统分区未被分配盘符或者 系统没有你要找的文件”的问题。
我当前电脑安装的是WIN7,后来我 ...

判断逻辑有问题
你是 逐个盘符判断如果 他没有 cmd.exe 就提示 没有系统分区,然后就关机,这样不行,
应该是 发现 cmd.exe 就设置个变量,循环结束后,通过这个变量的值判断是否找到了 windows 所在分区。
可以把这个变量的值设置为 存在cmd.exe 分区的盘符。

我上面 的附件 里面 有脚本,可以实现 找到 系统分区和 gho 位置。
你可以参考下。


作者: bjay2008xmy    时间: 2021-6-10 23:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-11 07:09
你得循环完了,才能确定所有盘符都没有WINDOWS,
作者: dos时代菜鸟    时间: 2021-6-11 08:16
本帖最后由 dos时代菜鸟 于 2021-6-11 09:12 编辑



我下面代码!!!!!是可以。。。。
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set find1=0
  4. 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 (
  5.         IF EXIST %%c:\windows\explorer.exe call :found1 %%c
  6. )

  7. if !find1! equ 0 echo 未找到 windows 分区
  8. pause

  9. goto :eof

  10. :found1
  11. set find1=1
  12. echo 找到 windows 分区 %1:
  13. exit /b
复制代码



下面是按照你的思路,写的。


  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set gho_file=systembak.gho
  4. set find1=0
  5. set find2=0
  6. 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 (
  7.    IF EXIST %%c:\windows\explorer.exe call :found1 %%c
  8.    if exist %%c:\!gho_file! call :found2 %%c
  9. )

  10. if !find1! equ 0 (
  11.    echo 未找到 windows 分区
  12.    call :error1
  13. )
  14. if !find2! equ 0 (
  15.    echo 未找到 GHO 文件
  16.    call :error1
  17. )

  18. ECHO.
  19. ECHO 接下来把!find2!:\systembak.gho恢复到!find1!:
  20. ghost64.exe -clone,mode=pload,src=!find2!:\systembak.gho:1,dst=!find1!: -sure
  21. ECHO 恢复系统已完成,准备关机
  22. wpeutil shutdown

  23. GOTO :EOF

  24. :found1
  25.    set find1=%1
  26.    echo 找到 windows 分区 %1:
  27. exit /b

  28. :found2
  29.    set find2=%1
  30.    echo 找到 GHO 文件 %1:\!gho_file!
  31. exit /b

  32. :error1
  33.    color 48
  34.    echo 按任意键关机
  35.    pause>nul
  36.    wpeutil shutdown
  37. exit /b
复制代码



但是问题是 ,你这个思路,如果 目标电脑 根本没有 windows ,甚至连分区都没有,是个新硬盘呢?
还是 考虑 再通过交互模式手动 选择分区?
如果硬盘上 有多个 windows 或者多个 systembak.gho 又改咋整?是否也要 考虑 交互式 选择?




作者: nttwqz    时间: 2021-6-11 08:48
之前建议楼主用vscode写脚本,楼主好像没有采用,即使用记事本,那也建议使用缩放,增加代码可读性。记事本建议采用Tab缩放,更简单。另外,建议楼主规范发帖,使用代码包含代码部分,增加帖子可读性。
作者: dos时代菜鸟    时间: 2021-6-11 08:52
nttwqz 发表于 2021-6-11 08:48
之前建议楼主用vscode写脚本,楼主好像没有采用,即使用记事本,那也建议使用缩放,增加代码可读性。记事本 ...

我都是用 notepad 3 ,简单能应付需求。

作者: dos时代菜鸟    时间: 2021-6-11 09:02
批处理虽然没有 面向对象 的概念,但是 ,可以参考 创建 模块和函数的概念,用 call + exit /b ,创建模块函数。
用变量做 模块或函数结果返回值。
脚本设计思路是,统一做好前期信息搜集,再最后完成 核心指令。
作者: hilsonma    时间: 2021-6-11 09:29
建议在for语句列表的时候尽量将共同的内容抽走以达成简化的目的

如:
将for %%j in (D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: Y: Z: C:)
改为for %%j in (D E F G H I J K L M N O P Q R S T U V W Y Z C)
原来引用%%j的地方改为%%j:

for %%k in (systembak.gho systembak.wim systembak.esd)
改为for %%k in (gho wim esd)
原来引用%%k的地方改为systembak.%%k

还要理解代码的本意,才能符合自己的意愿,如
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 (
这代码的意思本来就是由C至Z逐一查找cmd.exe,一找不到就提示出错,当然与楼主意愿不符,所以才会出22楼那样的问题
作者: nttwqz    时间: 2021-6-11 10:34
dos时代菜鸟 发表于 2021-6-11 08:52
我都是用 notepad 3 ,简单能应付需求。

自从偶然间用了vscode,就再也没有用过notepad++、notepad2、notepad3、emeditor之类的代码编辑器,vscode虽然设置一堆,但是你可以不改
作者: bjay2008xmy    时间: 2021-6-11 10:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-11 11:13
nttwqz 发表于 2021-6-11 10:34
自从偶然间用了vscode,就再也没有用过notepad++、notepad2、notepad3、emeditor之类的代码编辑器,vscod ...

好的,我也试试。
作者: bjay2008xmy    时间: 2021-6-11 11:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 11:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: hilsonma    时间: 2021-6-11 11:35
bjay2008xmy 发表于 2021-6-11 11:24
有使用条件的,所以我设置了找不到系统分区和系统映像时就按任意键关机,在多系统和多映像的情况下,只会 ...

你在使用for循环,所以建议选择找到的最后一个系统盘和最后一个映像
同于系统盘多数是C盘,所以找系统盘时倒序排列 Z Y X ... D C 这样最后一个就是C
作者: dos时代菜鸟    时间: 2021-6-11 12:29
bjay2008xmy 发表于 2021-6-11 11:33
这个用途可能比较小众化,是用来辅助对电脑不熟悉的人群恢复系统的,其目标在于:系统出问题时,只要插入 ...

想法是好的,
但是 如果是 gpt 分区结构带 esp 引导分区的,你改咋处理?esp 分区中的引导可能也损坏了。

你需要 找出 硬盘中负责引导 系统 的分区,有时 即便是 mbr 结构,引导分区与 windows 分区也可能不一样。

不考虑分区结构和类型的 还原操作,失败概率很大。

这个批处理是围绕 文件级别 开展的搜索,而 ghost 是对系统分区开展还原操作。 这样就差了一个级别,不对等,失败概率增加。






作者: nttwqz    时间: 2021-6-11 12:58
bjay2008xmy 发表于 2021-6-11 11:33
这个用途可能比较小众化,是用来辅助对电脑不熟悉的人群恢复系统的,其目标在于:系统出问题时,只要插入 ...

这么说肯定也要涉及数据备份恢复部分,IP备份等
作者: bjay2008xmy    时间: 2021-6-11 14:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 14:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 15:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 15:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: captain_g    时间: 2021-6-11 15:16
本帖最后由 captain_g 于 2021-6-11 15:18 编辑
bjay2008xmy 发表于 2021-6-11 11:33
这个用途可能比较小众化,是用来辅助对电脑不熟悉的人群恢复系统的,其目标在于:系统出问题时,只要插入 ...

“用来辅助对电脑不熟悉的人群恢复系统”?

既然是这个目的,还要“自动恢复”,那程序就因该有广泛的适应性,同时还必须采取措施,防止发生灾难性后果!

“设置了找不到系统分区和系统映像时就按任意键关机”,这种情况尤其是恢复系统,应该不多见,既然东西是基于PE的,这种情况应该留在PE,用户可以选择人工操作;

“在多系统和多映像的情况下,只会选择找到的第一个系统盘和第一个映像”,这个有严重缺陷!

为何肯定“第一个系统盘”与“第一个映像”就正是所需的而且两者是匹配的?

楼主搞这个,似乎思路主要是以自己熟悉的情形为前提,既然都有很多先决条件,那就无需搞得如此复杂;

对于特定已知静态的环境,搞这种自动有可行性;

如果要发布出去,就必须非常谨慎,建议必须设置哪怕最少一次人工干预,防止发生灾难性后果或徒劳无功,因为用GHO恢复就必须毁掉原有数据,用WIM或ESD通常须先行格式化。
作者: bjay2008xmy    时间: 2021-6-11 15:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 15:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: hilsonma    时间: 2021-6-11 16:01
bjay2008xmy 发表于 2021-6-11 15:41
其实还有其他因素让我认为这个方案可行值得去完善。

在去年的9月份我就做过U盘自动恢复系统这个方案, ...

你说的这种情形,我以前的做法是固定备份到D盘gho文件,开机时可按键选择一键还原。

后来时代发展了,我就改成固定备份到D盘wim文件,开机时可按键选择进入pe,pe桌面放一键还原。

现在如果可以的话,我会改用差分vhd,保留一个原版,复制两个副本,运行其中一个副本,桌面有一键还原,其实这时的一键还原就是将原版重新复制到副本,重启后运行复制成功的副本。
作者: bjay2008xmy    时间: 2021-6-11 16:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 16:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 22:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-11 22:12
本帖最后由 dos时代菜鸟 于 2021-6-11 22:15 编辑

这个功能,我用 dos 启动,做过光盘版的。 对应的是 mbr 分区 xp /win7 x86 系统。
也有 F9 一键还原的方案,把备份做到一个隐藏分区。

我坚持了8年的 dos工具箱,当时集成了 大约 30M 的dos 工具,用来做系统维护。

不过现在看来都过时了。进入 win pe 时代,再往后 要进入网络 云时代 和 物联网系统 时代,win pe 总有一天也会过时的。

现在 曾经的 dos版块 ,不也,变成 脚本讨论区了么。

谁也挡不住历史发展的车轮滚滚向前呀




作者: bjay2008xmy    时间: 2021-6-11 23:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-11 23:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-12 00:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2021-6-12 00:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: hilsonma    时间: 2021-6-12 02:24
本帖最后由 hilsonma 于 2021-6-12 02:26 编辑
bjay2008xmy 发表于 2021-6-12 00:20
感谢你提供的
if %xtp%a==a
代码,很实用。

假设有多个操作系统分区 C D E
Z Y X ... D C 这样最后一个就是C
C D E ... X Y Z 这样最后一个就是 E
我们要使for走完的话取的就是最后一个

当然复杂一些的话也可以将所有找到的存起来,再作进一步安排。
作者: dos时代菜鸟    时间: 2021-6-12 06:38
本帖最后由 dos时代菜鸟 于 2021-6-12 08:50 编辑
bjay2008xmy 发表于 2021-6-12 00:07
刚才我下载了你这个软件运行了一下,发现了一个问题。不知道你有没有意识到ghost某个版本之前识别的GPT硬 ...

管他咋定义的,那无非就是个分区的特定名称 ,只要能用这个名称完成任务就行呗。

gpt 分区,通常有 efi 分区 和 msr 分区,这两份分区 通常在 系统分区前,自然 系统分区就 被识别为 1.3 了,这个也属正常。

只要 omnifs 和 ghost 都 能使用同样的 分区识别体系,omnifs 识别出的分区标识 ghost 能用,就行呗。



作者: bjay2008xmy    时间: 2021-6-12 10:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2021-6-12 15:11
本帖最后由 dos时代菜鸟 于 2021-6-12 17:30 编辑

这个软件是GHOST 自带,有何不能通用?我电脑俩硬盘,MBR GPT分区都有,识别没问题。
OMNIFS 是GHOST 自家软件,不是我自制的。难道OMNIFS 和 GHOST 不一致?不能识别MSR分区?

GHOST能放心用,OMNIFS 就也应该被接纳。

如果涉及版本问题,可以统一一下,都是自家软件,内部代码都是统一一致的。
用GHOST搞系统恢复,为啥要用GHOST的分区标识体系呢?
有的分区没有盘符,却要用到,就要考虑不能依赖WIN的盘符开展操作。因为有时,备份文件是要藏起来的。

当然,这个就是个人理解和使用方向的问题,能达到目的就行啦。


上图,是 omnifs 和 diskpart 探测到分区表 和盘符 的情况。
而ghost 能识别出 esp 分区, 能够体现其盘符,但不能实现esp分区盘符与ghost分区号对应关系,对于 mrs 分区 ghost 和 omnifs 都忽略了。





作者: wlh1117    时间: 2021-6-15 22:32
启TinyPXE P2P安装WINDOWS系统、网启TinyPXE之CGI安装WINDOWS系统,方案偏向于自动化的,有没有现成的方案,放出来研究下
作者: wlh1117    时间: 2021-6-15 22:33
bjay2008xmy 发表于 2021-6-11 23:16
在各种程序语言中,我用的最多的就是批处理。除了这个,我还做过网启TinyPXE P2P安装WINDOWS系统、网启Ti ...

启TinyPXE P2P安装WINDOWS系统、网启TinyPXE之CGI安装WINDOWS系统,方案偏向于自动化的,这个有没有做好的,发个链接研究下
作者: bjay2008xmy    时间: 2021-6-15 22:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 一二三四五六    时间: 2021-7-27 19:10
脚本虽好,但是执行环境千变万化,其实这种脚本写的好的网上有很多但却鲜少有人用,没资料的可以用一下,有资料我觉得还是手动放心
作者: ktvsoft    时间: 2021-9-26 07:01
你好,如果GRUB2启动菜单一共有两个系统一个WIN7 一个WIN8,能否启动时候,第一次启动第一个菜单,第二次启动第二个菜单,也就是启动时候判断本地变量,为奇数启动第一个菜单,为偶数启动第二个菜单,保存当前启动次数到本地变量呢
作者: qrd8008    时间: 2021-9-26 08:01
不错,不错,不错的
作者: 610644034    时间: 2021-9-26 19:15
本帖最后由 610644034 于 2021-9-26 19:19 编辑

查找系统分区的批处理一看就是有问题的,就没有继续往下看了  我的硬盘你可以找到几个分区都有系统,也可以任何一个分区都没有系统! 怎么办?
作者: bjay2008xmy    时间: 2021-9-26 20:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: winpefk    时间: 2021-12-5 08:38
??盘符不止26!!!!!?多出来的盘,我记得NTFS只能挂载到文件夹,如果嵌套,是不是要把所有目录都搜索一遍???(估计得累死。。。)
作者: 51f    时间: 2022-1-12 18:47
批处理写起来还是太费劲了,其实要写程序,比如有几个盘,是mbr还是gpt盘,盘里有没有系统。恢复到哪个盘,等等,需要判断的很多
作者: 亚格斯    时间: 2022-1-13 20:26
厉害
作者: 亚格斯    时间: 2022-1-13 20:26
佩服
作者: bjay2008xmy    时间: 2022-1-13 20:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: zxcvghjmk    时间: 2022-2-24 11:39
这个脚本在pe下开机能自动连接gohst服务器吗




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