中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-22 03:16
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]从某个文件中提取文件名并执行相应操作的批处理 查看 2,152 回复 16
楼 主 [求助]从某个文件中提取文件名并执行相应操作的批处理 发表于 2007-08-20 20:50 ·  中国 江苏 扬州 电信
中级用户
积分 203
发帖 44
注册 2003-08-14 00:00
22年会员
UID 8600
性别 男
状态 离线
我想做一个从一个文件中提取特定文件名并执行相应操作的批处理,比如d盘根目录下的0.txt的内容为:
【asdasdas】
sdf44
open=000.exe
...

现在我想通过批处理提取出0.txt文件中“=”号后面的000.exe并执行相应操作比如删除,我的代码如下:
@echo off
for /f "delims=" %%p in ('findstr /i "open=" d:\0.txt') do (
set aa=%%p
set b=%aa:~5,20%
echo %b%
)
pause

可是执行后却没有预期的效果,请问我的代码哪错了?

[ Last edited by wjgyz740526 on 2007-8-20 at 11:04 PM ]
2 发表于 2007-08-21 08:14 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
你这样做肯定通用性不好,而且for的用法不对。改成这样试试:

@echo off
for /f "usebackq delims=" %%p in (`findstr /i "open=" d:\0.txt`) do (
set %%p
echo %open%
)
pause
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
3 发表于 2007-08-21 10:41 ·  中国 江苏 扬州 电信
中级用户
积分 203
发帖 44
注册 2003-08-14 00:00
22年会员
UID 8600
性别 男
状态 离线
老大你的cmd无效啊

而且能解释下吗?usebackq delims=什么意思?
4 发表于 2007-08-21 11:36 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
确实有点儿问题,改成这样:

@echo off & setlocal ENABLEDELAYEDEXPANSION
set open=
for /f "usebackq delims=" %%p in (`findstr /i "open=" d:\0.txt`) do (
set %%p
echo !open! & pause
)
endlocal
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
5 发表于 2007-08-21 15:46 ·  中国 江苏 扬州 电信
中级用户
积分 203
发帖 44
注册 2003-08-14 00:00
22年会员
UID 8600
性别 男
状态 离线
我的初衷是自动查找所有分区根目录下是否有autoron.inf(以及文件名包含autorun.inf的文件比如-autorun.inf),有的话删除该文件并且也删除这个文件中open=后指定的可执行文件。

我的代码:
@echo off
for %%a in (c d e f g h) do (
for /f %%i in ('dir /b /a-h %%a:\ ^|findstr /i "autorun.inf"') do (
for /f %%p in ('findstr /i "open=" %%a:\%%i') do (
set file=%%p
set nn=%file:~5%
echo %nn%
echo 在%%a盘下发现%%i和"%nn%"病毒!!
del /p /f /a-h %%a:\%%i
del /p /f /a-h %%a:\%nn%
)
)
)
pause
能找到autorun.inf文件但是奇怪的是它会把根目录下的所有文件都删除!那儿错了呢?
改成你的也这样:
@echo off
for %%a in (c d e f g h) do (
for /f %%i in ('dir /b /a-h %%a:\ ^|findstr /i "autorun.inf"') do (
set open=
for /f "usebackq delims=" %%p in ('findstr /i "open=" %%a:\%%i') do (
set %%p
echo 在%%a盘下发现%%i和!open!病毒!!
del /p /f /a-h %%a:\%%i
del /p /f /a-h %%a:\%nn%
)
)
)
pause
6 发表于 2007-08-21 15:55 ·  中国 江苏 扬州 电信
中级用户
积分 203
发帖 44
注册 2003-08-14 00:00
22年会员
UID 8600
性别 男
状态 离线
坛子里有一个autorun.inf病毒免疫程序,我看了下它不是根据autorun.inf中指定的可执行文件来删除
7 发表于 2007-08-21 15:57 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
你的批处理肯定是有问题的。而我的批处理并没有问题。

三个for循环嵌套的批处理我并没有写过,而且这东西很不好测试。总之,你的批处理写的有问题,自己最好再好好调试一下。你对for命令的用法并不十分掌握,再好好研究一下吧。
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
8 发表于 2007-08-21 16:05 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
下面是我写的批处理,我测试了一下,基本上正常。

@echo off & setlocal ENABLEDELAYEDEXPANSION
for %%a in (c d e f g h i j k l m n) do (
for /f "usebackq delims=" %%i in (`dir /b /a-d %%a:\ ^| find /i "autorun.inf"`) do (
set open=
for /f "usebackq delims=" %%p in (`findstr /i "open=" %%a:\%%i`) do (
set %%p
echo 在%%a盘下发现%%i和!open!病毒!!
del /p /f /a %%a:\%%i
del /p /f /a %%a:\!open!
)
)
)
pause
endlocal


另外,del /p /f /a %%a:\!open!这条命令恐怕是有问题的,因为!open!有可能包括了盘符。
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
9 发表于 2007-08-21 16:20 ·  中国 江苏 扬州 电信
中级用户
积分 203
发帖 44
注册 2003-08-14 00:00
22年会员
UID 8600
性别 男
状态 离线
我看了下,你的代码比我的只是多了"usebackq delims=" 这一段,请问这段怎么解释呢?for /?看不明白

你说的!open!有可能包括了盘符什么意思?这就是误删的原因吗?该怎么解决呢?
10 发表于 2007-08-21 16:23 ·  IANA 局域网IP(Private-Use)
初级用户
★★
积分 113
发帖 51
注册 2007-02-15 22:54
19年会员
UID 79590
性别 男
状态 离线
樓主的這個問題偶也問過Climbing大哥﹐幫你轉一下Climbing的回帖。
以下是Climbing的回帖
usebackq我是这样理解的:使用反引号(`)括起将来执行的命令序列,正常情况下是使用单引号(')来括起命令,但有时候命令参数中需要用到单引号或者双引号(这时就会造成单双引号的混乱),这时候最好就是使用usebackq参数,然后使用反引号来括起命令,就不会产生这种困扰了。

至于“delims=”参数,则是用来指定字符串分隔符的,for /f命令主来用来提取一个字符串中的字段,既然有字段的区分,就要有分隔字段的符号,默认是空格或者Tab,你可以使用delims=来指定你自己要使用的分隔符,而在本例中,你当然不希望使用任何分隔符,所以指定delims=空。

这个,看微软的for /?就可以查到了,尽管它的解释让人感觉很晕,但时间长了自然就明白了。
11 发表于 2007-08-21 16:23 ·  中国 江苏 扬州 电信
中级用户
积分 203
发帖 44
注册 2003-08-14 00:00
22年会员
UID 8600
性别 男
状态 离线
如果!open!有可能包括盘符,那么我先用set把变量转移下是不是就可以了呢?
12 发表于 2007-08-21 16:23 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
你看别人的批处理并不仔细,我的批处理跟你的仅仅有那么一点儿区别吗?

区别大了去了,所以我说你对for命令的用法并不是十分掌握。你运行一下我的批处理,看看效果再说。
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
13 发表于 2007-08-21 16:25 ·  IANA 局域网IP(Private-Use)
初级用户
★★
积分 113
发帖 51
注册 2007-02-15 22:54
19年会员
UID 79590
性别 男
状态 离线
Originally posted by Climbing at 2007-8-21 04:23 PM:
你看别人的批处理并不仔细,我的批处理跟你的仅仅有那么一点儿区别吗?

区别大了去了,所以我说你对for命令的用法并不是十分掌握。你运行一下我的批处理,看看效果再说。




呵呵﹐我已試過是可以用的。

[ Last edited by superadam on 2007-8-21 at 04:33 PM ]
附件
未命名.jpg
14 发表于 2007-08-21 16:30 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
实际上我这里根本找不到autorun.inf这一类的病毒,所以,我测试批处理都是用我自己造的试验数据,所以,到底是不是符合实际情况,我并不敢保证,所以我说那条删除!open!的命令有可能有问题。只要了解了原理,解决也并不复杂,在删除!open!之前先检测一下是否有盘符,如果有就不加盘符就可以了,这个并不复杂。
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
15 发表于 2007-08-21 16:38 ·  IANA 局域网IP(Private-Use)
初级用户
★★
积分 113
发帖 51
注册 2007-02-15 22:54
19年会员
UID 79590
性别 男
状态 离线
Originally posted by Climbing at 2007-8-21 04:30 PM:
实际上我这里根本找不到autorun.inf这一类的病毒,所以,我测试批处理都是用我自己造的试验数据,所以,到底是不是符合实际情况,我并不敢保证, ...


請教Climbing大哥﹕
如上圖所示﹕
這里面有個FINDSTR﹕無法開啟D:是怎么回事?

[ Last edited by superadam on 2007-8-21 at 04:40 PM ]
论坛跳转: