标题: [求助]从某个文件中提取文件名并执行相应操作的批处理
[打印本页]
作者: wjgyz740526
时间: 2007-8-20 20:50
标题: [求助]从某个文件中提取文件名并执行相应操作的批处理
我想做一个从一个文件中提取特定文件名并执行相应操作的批处理,比如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 ]
作者: Climbing
时间: 2007-8-21 08:14
你这样做肯定通用性不好,而且for的用法不对。改成这样试试:
@echo off
for /f "usebackq delims=" %%p in (`findstr /i "open=" d:\0.txt`) do (
set %%p
echo %open%
)
pause
作者: wjgyz740526
时间: 2007-8-21 10:41
老大你的cmd无效啊
而且能解释下吗?usebackq delims=什么意思?
作者: Climbing
时间: 2007-8-21 11:36
确实有点儿问题,改成这样:
@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
作者: wjgyz740526
时间: 2007-8-21 15:46
我的初衷是自动查找所有分区根目录下是否有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
作者: wjgyz740526
时间: 2007-8-21 15:55
坛子里有一个autorun.inf病毒免疫程序,我看了下它不是根据autorun.inf中指定的可执行文件来删除
作者: Climbing
时间: 2007-8-21 15:57
你的批处理肯定是有问题的。而我的批处理并没有问题。
三个for循环嵌套的批处理我并没有写过,而且这东西很不好测试。总之,你的批处理写的有问题,自己最好再好好调试一下。你对for命令的用法并不十分掌握,再好好研究一下吧。
作者: Climbing
时间: 2007-8-21 16:05
下面是我写的批处理,我测试了一下,基本上正常。
@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!有可能包括了盘符。
作者: wjgyz740526
时间: 2007-8-21 16:20
我看了下,你的代码比我的只是多了"usebackq delims=" 这一段,请问这段怎么解释呢?for /?看不明白
你说的!open!有可能包括了盘符什么意思?这就是误删的原因吗?该怎么解决呢?
作者: superadam
时间: 2007-8-21 16:23
樓主的這個問題偶也問過Climbing大哥﹐幫你轉一下Climbing的回帖。
以下是Climbing的回帖
Quote: |
usebackq我是这样理解的:使用反引号(`)括起将来执行的命令序列,正常情况下是使用单引号(')来括起命令,但有时候命令参数中需要用到单引号或者双引号(这时就会造成单双引号的混乱),这时候最好就是使用usebackq参数,然后使用反引号来括起命令,就不会产生这种困扰了。
至于“delims=”参数,则是用来指定字符串分隔符的,for /f命令主来用来提取一个字符串中的字段,既然有字段的区分,就要有分隔字段的符号,默认是空格或者Tab,你可以使用delims=来指定你自己要使用的分隔符,而在本例中,你当然不希望使用任何分隔符,所以指定delims=空。
这个,看微软的for /?就可以查到了,尽管它的解释让人感觉很晕,但时间长了自然就明白了。 |
|
作者: wjgyz740526
时间: 2007-8-21 16:23
如果!open!有可能包括盘符,那么我先用set把变量转移下是不是就可以了呢?
作者: Climbing
时间: 2007-8-21 16:23
你看别人的批处理并不仔细,我的批处理跟你的仅仅有那么一点儿区别吗?
区别大了去了,所以我说你对for命令的用法并不是十分掌握。你运行一下我的批处理,看看效果再说。
作者: superadam
时间: 2007-8-21 16:25
Quote: |
Originally posted by Climbing at 2007-8-21 04:23 PM:
你看别人的批处理并不仔细,我的批处理跟你的仅仅有那么一点儿区别吗?
区别大了去了,所以我说你对for命令的用法并不是十分掌握。你运行一下我的批处理,看看效果再说。 |
|
呵呵﹐我已試過是可以用的。
[
Last edited by superadam on 2007-8-21 at 04:33 PM ]
附件
1:
未命名.jpg (2007-8-21 16:32, 38.93 K,下载次数: 1)
作者: Climbing
时间: 2007-8-21 16:30
实际上我这里根本找不到autorun.inf这一类的病毒,所以,我测试批处理都是用我自己造的试验数据,所以,到底是不是符合实际情况,我并不敢保证,所以我说那条删除!open!的命令有可能有问题。只要了解了原理,解决也并不复杂,在删除!open!之前先检测一下是否有盘符,如果有就不加盘符就可以了,这个并不复杂。
作者: superadam
时间: 2007-8-21 16:38
Quote: |
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 ]
作者: wjgyz740526
时间: 2007-8-21 16:46
确实,很汗颜,受教了
谢谢
作者: Climbing
时间: 2007-8-21 17:20
Quote: |
Originally posted by superadam at 2007-8-21 16:38:
請教Climbing大哥﹕
如上圖所示﹕
這里面有個FINDSTR﹕無法開啟D:是怎么回事?
[ Last edited by superadam on 2007-8-21 at 04:40 PM ] |
|
我一时也找不出问题所在,问题似乎出在第二个for循环上,但我这里又没有出现类似的问题,所以很难判断问题的原因了。