Board logo

标题: [文件操作] 为何cmd窗口在命令执行完后不关闭 [打印本页]

作者: 5i365    时间: 2021-8-4 13:59     标题: 为何cmd窗口在命令执行完后不关闭

代码如下:
  1. @echo off
  2. (echo notepad
  3. echo del %%0
  4. )>a.bat
  5. start a.bat
  6. del %0
复制代码
把上面的代码存为b.bat,执行它后生成a.bat批处理后,接着执行它,然后删除自身
a.bat执行完后也删除自身

目前的执行情况是,最终目的达到了,两个批处理都执行并删除了,

但是a.bat在执行完后,提示文件不存在,且cmd窗口没关闭

请教高手,怎样解决这两个问题, 提前感谢
作者: yakeyun    时间: 2021-8-4 16:55

本帖最后由 yakeyun 于 2021-8-4 17:08 编辑

回复 1# 5i365

要让程序单独运行,脱离代码文件执行,所以需要加上start命令。
同时调用另一个批处理,最好用call命令,可以等待a代码执行完了,再执行b的自删除,避免报错。
@echo off
(echo,start notepad
echo,del %%0
)>a.bat
call a.bat
del %0
作者: 5i365    时间: 2021-8-4 18:45

本帖最后由 5i365 于 2021-8-4 19:07 编辑

回复 2# yakeyun

感谢大侠支招,现在还有如下的问题,能帮忙看下吗?再次感谢!!!:

现在下面代码另存成的批处理, 是最后删除的, 我的本意是,它只是生成a.bat     b.bat     c.bat三个批处理文件,生成后它的使命就完成,就删除自身,而不想最后删
  1. @echo off
  2. ::a.bat 启动记事本, 记事本关闭后, 运行b.bat
  3. (echo,start /wait notepad
  4. echo,call b.bat
  5. )>a.bat
  6. ::b.bat 先删a.bat, 启动计算器, 计算器关闭后, 运行c.bat
  7. (echo,del a.bat
  8. echo,start /wait calc
  9. echo,call c.bat
  10. )>b.bat
  11. ::c.bat 先删b.bat, 启动写字板, 删除自己
  12. (echo,del b.bat
  13. echo,start /wait wordpad
  14. echo,del %%0
  15. )>c.bat
  16. call a.bat
  17. del %0
复制代码

作者: cmd1152    时间: 2021-8-4 19:56

回复 3# 5i365


    去掉/wait
作者: 5i365    时间: 2021-8-4 20:12

回复 4# cmd1152


去掉后, 记事本, 计算器, 写字板就同时打开了
作者: cmd1152    时间: 2021-8-4 20:31

回复 5# 5i365


    Call改成Start
作者: 5i365    时间: 2021-8-4 21:17

回复 6# cmd1152

你好, 改成start 最后会提示如下的信息, CMD窗口不能自动关闭

   
C:\Users\Administrator\Desktop>start /wait notepad

C:\Users\Administrator\Desktop>call b.bat

C:\Users\Administrator\Desktop>del a.bat

C:\Users\Administrator\Desktop>start /wait calc

C:\Users\Administrator\Desktop>call c.bat

C:\Users\Administrator\Desktop>del b.bat

C:\Users\Administrator\Desktop>start /wait wordpad

C:\Users\Administrator\Desktop>del c.bat
找不到批处理文件。
找不到批处理文件。
找不到批处理文件。

C:\Users\Administrator\Desktop>
作者: yakeyun    时间: 2021-8-4 22:45

回复 3# 5i365


如果没有特殊需求,为什么不简化运行:

@echo off
start /wait notepad
start /wait calc
:calc
tasklist /nh>C:\kill.ini
@find /I /C "Calculator.exe" C:\kill.ini > nul
if %ERRORLEVEL% == 1 (start /wait wordpad) else (goto calc)
del %0
作者: 5i365    时间: 2021-8-5 07:03

回复 8# yakeyun


    感谢支招!! 确实有个特殊要求:
上面批处理, 我的本意是,让它只是生成a.bat     b.bat     c.bat三个批处理文件,然后就自删,再执行a.bat, 接着b.bat, 最后c.bat, 这三个批处理内的程序也是先后运行, 也是先后删除
作者: cmd1152    时间: 2021-8-5 11:19

回复 9# 5i365


    自删了怎么执行?
作者: yakeyun    时间: 2021-8-5 23:21

本帖最后由 yakeyun 于 2021-8-5 23:22 编辑

回复 3# 5i365


@echo off

::a.bat
(echo,@echo off
echo,if exist test.bat del test.bat
echo,call notepad
echo,call b.bat
)>a.bat

::b.bat
echo,@echo off >b.bat
echo,del a.bat >>b.bat
echo,call calc >>b.bat
echo,:run >>b.bat
echo,tasklist /nh ^>C:\kill.ini >>b.bat
echo,find /I /C "Calculator.exe" C:\kill.ini > nul >>b.bat
echo,if %%ERRORLEVEL%% == 1 (call c.bat^&del b.bat^&taskkill /f /im cmd.exe) else (goto run) >>b.bat

::c.bat
(echo,@echo off
echo,start wordpad
echo,del %%0
)>c.bat

start /min a.bat
作者: 5i365    时间: 2021-8-6 08:22

回复 11# yakeyun


    非常感谢支招, 有两个情况,
批处理没有删自身,删的test.bat
b和c是一块删的




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2