中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 07:18
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » [已解决]关于变量字符截取
可打印版本  935 / 4
第1楼 shrek 发表于 2010-12-07 10:50
新手上路 发帖 3 积分 3
[已解决]关于变量字符截取
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=- " %%a in ('date /t') do set nowdate=%%a%%b%%c
for /f %%a in ('dir d:\adupdate /a:d /b /o:d^|findstr "^*$"') do (
set lodpatch=%%a
if %lodpatch:~0,8% neq %nowdate% (del d:\adupdate\%%a)
)

我想删除早于当天生成的文件夹。因为文件夹会有其他后缀,所以想截取前8位做比较。求在for循环中引用当前变量的方法。%lodpatch:~0,8% 为什么不起作用呢?
谢谢

[ Last edited by shrek on 2010-12-8 at 20:42 ]
第2楼 Hanyeguxing 发表于 2010-12-07 11:24
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
1,因为下面没有!!括的变量,所以setlocal enabledelayedexpansion没有必要
2,相对于'date /t',推荐直接使用"%date%"
3,因为楼主使用了%lodpatch:~0,8%,那么说明文件夹名必须前8位型如20101207,如果型如2010127这样就会出错。
4,因为在第二个for中没指定分隔符,所以文件夹名中不能有空格!
5,findstr "^*$,这里的*是重复的意思,通配为.,所以按照这个命令过滤出的文件夹名只能由0-9和_11个字符构成,其他的都会被排除。
但楼主说“因为文件夹会有其他后缀”那么就是文件夹名中还有.或其他字符等,那么几乎就不会有文件夹剩下来了。楼主可以用这个代码测试就知道了:

看显示几个文件夹
第3楼 shrek 发表于 2010-12-07 11:34
新手上路 发帖 3 积分 3
谢谢回答,已经解决了,文件夹都是20101206,20101206_1,20101206_2类是的文件。
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=- " %%a in ('date /t') do set nowdate=%%a%%b%%c
for /f %%a in ('dir d:\adupdate /a:d /b /o:d^|findstr "^[0-9_]*$"') do (
set lodpatch=%%a
if !lodpatch:~0,8! neq %nowdate% (del d:\adupdate\%%a)
)
把%换成!就实现了需要的功能。
怎么理解变量时使用%,!,还有set "a=!a:~0,8!" 这里的双引号怎么理解。
第4楼 shrek 发表于 2010-12-07 11:42
新手上路 发帖 3 积分 3
为什么没用%date%呢?
在不同的系统显示出来的顺序不一样,所以我使用了date /t
xp和2003这么显示: 2010-12-07 星期二
2000 却这么显示: 星期二 2010-12-07
我这个要在不同的系统使用 :)
第5楼 HAT 发表于 2010-12-07 22:58
版主 发帖 5,017 积分 9,023
批处理标准化获取当前系统日期
http://bbs.bathome.net/thread-3328-1-1.html
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023