中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-15 13:03
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]setlocal enabledelayedexpansion位置到底放哪最好? 查看 2,070 回复 17
楼 主 [求助]setlocal enabledelayedexpansion位置到底放哪最好? 发表于 2008-10-22 09:26 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
我有60000多个txt文件,他们的文件名可能含有特殊字符。现在我想把它们分成两部分,一部分是文件内容有字符串“-beijing”的,其他的算另外一部分。
开始想把setlocal enabledelayedexpansion放在最外面,但发现漏掉了几个特殊的文件名。所以把它放在了里面。但是不知道为什么K就不能累加了?怎么样才能让K也像n一样累加啊。

:start
set n=0
set k=0
for /r E:\terry\test %%a in (*.txt) do (
set m=0
set /a n+=1
set tpath=%%~Fa
set fname=%%~na
setlocal enabledelayedexpansion
for /f "tokens=1 delims=-" %%b in ('findstr /i "\-beijing" "!tpath!"') do (
set temp=%%b
set /a m+=1
if !m! == 1 set /a K+=1&&echo !temp!>>E:\terry\beijing.txt&&move !tpath! E:\terry\beijing)
cls
echo totally scan !n! files
echo totally find !k! beijing files
endlocal
)
2 发表于 2008-10-22 09:47 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
试试放到第一个 for 的下面一行。即:

for /r E:\terry\test %%a in (*.txt) do (
setlocal enabledelayedexpansion
set m=0
3 发表于 2008-10-22 09:57 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
if !m! == 1 set /a K+=1
如果!m!不等于1,那么K就没办法进行累加...
4 发表于 2008-10-22 10:04 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
Originally posted by tireless at 2008-10-22 09:47:
试试放到第一个 for 的下面一行。即:

for /r E:\terry\test %%a in (*.txt) do (
setlocal enabledelayedexpansion
set m=0



不行啊,我试过了,像这种文件名'CV@A(31(2CPE.txt' 它会自动过滤掉@字符,但是如果把setlocal enabledelayedexpansion放在后面就没事.可是又不能K累加.
5 发表于 2008-10-22 10:06 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
Originally posted by moniuming at 2008-10-22 09:57:
if !m! == 1 set /a K+=1
如果!m!不等于1,那么K就没办法进行累加...


文件里有可能有很多-beijing这样的字符,所以只要找到一个就行,只要找到就累加.省得重复.
6 发表于 2008-10-22 10:52 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
我想应该是空格的问题,因为"!m! "(后面有一空格)不等于" 1"(前面有一空格),试试用引号括起来看看?如下:
if "!m!"=="1" (
set /a K+=1
echo !temp!>>E:\terry\beijing.txt
move !tpath! E:\terry\beijing
)
7 发表于 2008-10-22 11:03 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
Originally posted by moniuming at 2008-10-22 10:52:
我想应该是空格的问题,因为"!m! "(后面有一空格)不等于" 1"(前面有一空格),试试用引号括起来看看?如下:
if "!m!"=="1" (
...



if !m! == 1 set /a K+=1&&echo !temp!>>E:\terry\beijing.txt&&move !tpath! E:\terry\beijing
这句执行了几千次,但是K就是在0和1间跳动.
8 发表于 2008-10-22 11:50 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
if !m! == 1 set /a K+=1&&echo !temp!>>E:\terry\beijing.txt&&move !tpath! E:\terry\beijing
这句执行了几千次,但是K就是在0和1间跳动.

你试过6楼的方法了吗
9 发表于 2008-10-22 12:35 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
Originally posted by moniuming at 2008-10-22 11:50:

你试过6楼的方法了吗


试了下,还是一样K不会累加, 只会在1和0间变化,但是它后面的几句都能正常执行.执行完后好像K又会变为0,不知道是不是在setlocal enabledelayedexpansion 设置初始值的问题啊?

[ Last edited by terrytong on 2008-10-22 at 12:38 ]
10 发表于 2008-10-22 13:01 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
换个角度

FINDSTR
/I 指定搜索不分大小写。
/S 在当前目录和所有子目录中搜索匹配文件。
/M 如果文件含有匹配项,只打印其文件名。

findstr /i /s /m "-beijing" *.txt

for /f "delims=" %%i in ('findstr /i /s /m "beijing" *.txt') do echo %cd%\%i
49206C6F766520796F752067757973 54656C3A3133383238343036373837
11 发表于 2008-10-25 13:36 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
期待更多的高手过来看看啊,
除了K不能累加,其他都的能正常执行.
12 发表于 2008-10-25 14:19 ·  中国 湖南 长沙 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
不明白你的代码真正意图是什么?
当 m 等于 1 时 k累加?
仅解决你原代码 k 的累加问题。


:start
set n=0
set k=0
for /r E:\terry\test %%a in (*.txt) do (
set m=0
set /a n+=1
set tpath=%%~Fa
set fname=%%~na
setlocal enabledelayedexpansion
for /f "tokens=1 delims=-" %%b in ('findstr /i "\-beijing" "!tpath!"') do (
set temp=%%b
set /a m+=1
if !m! == 1 call :loop
cls
echo totally scan !n! files
echo totally find !k! beijing files
endlocal
)
pause
:loop
set /a K+=1&&echo !temp!>>E:\terry\beijing.txt&&move !tpath! E:\terry\beijing
goto :eof
致精致简!
13 发表于 2008-10-25 14:45 ·  中国 上海 上海地面通信息网络有限公司
中级用户
★★
积分 240
发帖 115
注册 2008-03-10 19:31
18年会员
UID 112561
性别 男
状态 离线
还是不行啊,
当 m 等于 1 时 k才累加,是因为有的txt里面有好几个-beijing.但是一个txt只需找到一个就好了.不需要截取重复的号码.
动行的结果还是和以前一样,当转到loop时K就是1,其它时就是0.

[ Last edited by terrytong on 2008-10-25 at 15:03 ]
附件
baijing.JPG
14 发表于 2008-10-25 15:21 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
试试这个?应该能解决k的问题,其它的代码自己弄.
现在才发图片,晕死,怎么可以是tokens=1呢!?
@echo off
for /r e:\terry\test %%a in (*.log) do (
set /a n+=1
call :countbj "%%a"
)
echo totally scan %n% files.
echo totally find %k% beijing files.
pause&goto :eof
:countbj
for /f %%a in ('findstr /i "beijing" %1') do (
set /a "k+=1"
goto :eof
)


[ Last edited by moniuming on 2008-10-25 at 15:48 ]
15 发表于 2008-10-25 15:28 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线

for /f "delims=" %%i in ('findstr /i /s /m "createobject" E:\script\*.*') do (
set /a k+=1
echo move "%%i" E:\terry\beijing
)
echo %k%
49206C6F766520796F752067757973 54656C3A3133383238343036373837
论坛跳转: