Board logo

标题: 求助:关于找不到批处理的提示 [打印本页]

作者: eech     时间: 2007-5-31 23:30    标题: 求助:关于找不到批处理的提示

C:\Documents and Settings\All Users\「开始」菜单\卸载IE多窗口插件.bat

内容如下:
----------------------------------
@ECHO off
echo 你确定要卸载IE多窗口插件吗?
echo 按任意键开始卸载!(会自动关闭IE窗口和资源管理器窗口)
pause>nul
attrib -s -h -r "%ALLUSERSPROFILE%\「开始」菜单\卸载IE多窗口插件.bat"
taskkill /f /im iexplore.exe>nul 2>nul
taskkill /f /im explorer.exe>nul 2>nul
regsvr32 /u /s %windir%\system32\WebTools.dll
del %windir%\system32\Help.gif
del %windir%\system32\settings.gif
del %windir%\system32\license.dat
del %windir%\system32\WebTools.dll
del %windir%\system32\WebToolshelp.htm
del %windir%\system32\WebToolssettings.htm
reg delete "HKEY_CURRENT_USER\Software\Microgarden\WebTools" /f
start explorer.exe
start ...
del %0
-----------------------------------
可正常运行,并生效,最后删除自身,只是运行到最后提示“找不到批处理文件”改了无数次,实在不知哪不对了,请好心人帮忙看看
作者: lxmxn     时间: 2007-6-1 00:37
去掉@echo off和del %0自己检查一下.
作者: zh159     时间: 2007-6-1 01:34
看错^_^

我这里可以删除,只是不能在命令行运行这个目录的批处理,提示“找不到批处理文件”

试试:
del %0>nul 2>nul

[ Last edited by zh159 on 2007-6-1 at 10:57 AM ]
作者: eech     时间: 2007-6-1 10:46
不行啊,加了AH,还是提示找不到,
作者: ttyp     时间: 2007-6-1 11:52
是不是因为有长目录或者带空格的目录还是中文目录?
作者: ttyp     时间: 2007-6-1 11:52
del "%0"

作者: zh159     时间: 2007-6-1 11:57


  Quote:
Originally posted by ttyp at 2007-6-1 11:52:
del "%0"

直接使用%0会自带双引号
作者: eech     时间: 2007-6-1 12:27
大家可以保存我的批处理文件试一下,无论怎么写都会提示找不到批处理文件,

错误提示:

WINDOWS找不到文件夹 /IDLIST:252:856,请确定文件名是否正确,再试一次,要搜索文件,请单击「开始」菜单按钮,然后单击"搜索"
作者: eech     时间: 2007-6-1 12:28


  Quote:
Originally posted by zh159 at 2007-6-1 01:34:
看错^_^

我这里可以删除,只是不能在命令行运行这个目录的批处理,提示“找不到批处理文件”

试试:
del %0>nul 2>nul

[ Last edited by zh159 on 2007-6-1 at 10:57 AM ]

早加过了,还是有错误提示
作者: dikex     时间: 2007-6-1 13:10
我这里运行正常,运行后可以自行退出并删除自身
作者: eech     时间: 2007-6-1 13:29


  Quote:
Originally posted by dikex at 2007-6-1 13:10:
我这里运行正常,运行后可以自行退出并删除自身

我也是可以的,但如果你仔细看,最后会有一句,找不到批处理的提示,虽不影响使用,但我想找出原因
作者: dikex     时间: 2007-6-1 13:59
先做一个试验,写一个批处理,内容为
@echo off
pause
echo a
pause
运行后先不要按任何键,在那个批处理上面右键——编辑,将echo a改为echo b,保存后转为那个正在运行的批处理的窗口,按一下任意键,结果echo出来的是b而不是a!

再做一个试验,批处理内容如下:
@echo off
pause
echo a
pause
同样运行后不要按任何键,然后把那个批处理文件删除或者重命名,接着转为批处理的运行窗口,按一下任意键,批处理直接退出而不执行下面的语句,隐约看到一行报错的语句;


关于这个,以下为个人猜测:

批处理运行时并不会一开始就将所有的代码载入内存,而是每执行完一行才载入下一行的代码,于是我们就产生了试验里面中途改变代码后执行的是修改后的代码;

具体到楼主的那个批处理,由于批处理在运行时把自身删除了,在执行完那个del的命令后系统想往下读取下一行命令时却发现找不到那个批处理文件,于是就报错了。

[ Last edited by dikex on 2007-6-1 at 02:04 PM ]
作者: dikex     时间: 2007-6-1 14:07
使用cmd /k来调用那个试验批处理,结果比较容易观测
作者: HAT     时间: 2007-6-1 20:12

@echo off
echo hello
del %0

@echo off
echo hello
del "%0"

@echo off
echo hello
del %0>nul 2>nul
网上有人说del %0后面不能加回车,但是经我测试,以上三段代码无论怎样改都会报错,跟楼主一样。
我的测试环境XP SP2
等待高人出现
作者: 48344620     时间: 2007-6-1 21:38
同意12楼的说法,我也测试了一下,和14楼的结果一样。
作者: qzwqzw     时间: 2007-6-28 09:29
关于批处理自删除的例子以前讨论过一些

因为那个错误是cmd删除文件后再读文件时提示的

所以在del后加2>nul是没有用的

最简单的莫过于 cmd /k 重新开启一个cmd会话

自然就将原会话中的错误抛弃了

这一句适用于dos和cmd:
%comspec% /k del %0

cmd 中可以有以下变化
%comspec% /k del "%~0" /a /f 2>nul

----------------------------------------------

另外一个极端的方法就是

首先屏蔽标准错误设备的输出再删除

dos下使用ctty nul
cmd下使用cd. 2>nul 3>nul

不过其副作用也是很大的

dos中的当前环境不再处理任何输入输出
系统处于假死状态
所以通常用于所有的操作均在批处理中完成后直接重启的情况

cmd中当前会话以后所有的错误均不输出
所以一般需要新开一个cmd会话运行批处理之后退出这个会话
--------------------------------------------------------------

其它的方法也有过讨论
不过已经记不太清除了
大概也是运用了辅助批处理或者其它脚本