中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助][讨论]字符串截取的问题
作者:
标题: [求助][讨论]字符串截取的问题 上一主题 | 下一主题
onlyu2000
新手上路





积分 15
发帖 14
注册 2008-9-2
状态 离线
『楼 主』:  [求助][讨论]字符串截取的问题

在我需要做的是在FOR循环中,用%string:~A,B%的形式对字符串截取,而且string、A、B都是变量,这样能实现吗? 貌似系统不会对!符号做嵌套分析


2010-6-1 11:05
查看资料  发短消息  网志   编辑帖子  回复  引用回复
nickwu
新手上路





积分 8
发帖 8
注册 2010-5-31
状态 离线
『第 2 楼』:  这个问题偶碰到过

好像是可以的 我写了个演示程序,希望对你有所启发
@echo off
pushd "%~dp0"
set a=0
set b=2

for %%i in (*.*) do (
echo 截取前:"%%~i"
set c="%%~i"
call echo 截取后:%%c:~%a%,%b%%%"
)

popd
echo 任意键退出...
pause >nul
exit
关键之处在于call和%%


2010-6-1 11:33
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
onlyu2000
新手上路





积分 15
发帖 14
注册 2008-9-2
状态 离线
『第 3 楼』:  

谢谢楼上,我的意思是string、a 和b的值在for中都会变化,需要加延迟变量特性并用!a!,!b!来表示,这样写就是有重叠的!!符号,系统不会嵌套分解


2010-6-1 11:56
查看资料  发短消息  网志   编辑帖子  回复  引用回复
nickwu
新手上路





积分 8
发帖 8
注册 2010-5-31
状态 离线
『第 4 楼』:  

能贴一些原代码吗,好帮你分析


2010-6-1 12:03
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
onlyu2000
新手上路





积分 15
发帖 14
注册 2008-9-2
状态 离线
『第 5 楼』:  

@echo off setlocal enabledelayedexpansion for %%a in (*.txt) do ( set FN=%%~na call strstr !FN! _By /I set pos=!errorlevel! set var=!FN:~0,!pos!! echo !var! ) pause


2010-6-1 12:13
查看资料  发短消息  网志   编辑帖子  回复  引用回复
onlyu2000
新手上路





积分 15
发帖 14
注册 2008-9-2
状态 离线
『第 6 楼』:  

其中strstr 是一个我写的查找字符串位置的批处理文件 用%errorlevel%返回结果 本意是要去除文件名中“_By”及其之后的字符 [ Last edited by onlyu2000 on 2010-6-1 at 12:23 ]


2010-6-1 12:15
查看资料  发短消息  网志   编辑帖子  回复  引用回复
nickwu
新手上路





积分 8
发帖 8
注册 2010-5-31
状态 离线
『第 7 楼』:  办法总会有滴

吃完饭回来继续测试,发现以下代码效果极佳~~
@echo off
pushd "%~dp0"

for %%a in (*.txt) do (	
	set fn="%%~na"
	call echo %%fn%%
	set pos=2
	call call echo %%%%fn:~0,%%pos%%%%%%"

)
pause 
其实延迟变量的问题不一定非要用setlocal enabledelayedexpansion来解决, 用call也行,可能是出于简洁的考虑,我不大喜欢用setlocal enabledelayedexpansion, 所以我写的代码一般都不会有setlocal enabledelayedexpansion,当然也就不会出现用!感叹号来进行引用的变量 这一点希望你理解,我觉得不管用什么办法,只要能达到目的就行。 修改并优化了一下你的代码,如下:
for %%a in (*.txt) do (
	set pos=0
	set FN="%%~na"
	call echo %%FN%%
	::这里假设strstr是一个外部程序
	call strstr %%FN%% _By /I
	if errorlevel 1 (
	set pos=1
	) else (
	set pos=0
	)
	call call echo "%%%%fn:~1,%%pos%%%%%%"

)
pause 
测试下代码看行不行 因为里面有你自己写的程序,所以 我这里无法保证你写的代码最终都是正确的,需要你自己去测试运行 另外这里给你编写代码提个建议 用set给字符串变量赋值的时候,最好带上引号,这样兼容性会好点 如:set FN="%%~na" [ Last edited by nickwu on 2010-6-1 at 14:37 ]


2010-6-1 13:54
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
onlyu2000
新手上路





积分 15
发帖 14
注册 2008-9-2
状态 离线
『第 8 楼』:  

谢谢楼上了,我试试看


2010-6-1 15:27
查看资料  发短消息  网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 9 楼』:  

1,嵌套的基本方法:
@echo off&setlocal enabledelayedexpansion
set/a a=1,b=2,c=1234567890
echo.!c:~%a%^,%b%!
pause
2,在for中一般不推荐使用call: ①,因为call的因为效率低,for的循环次数越多越明显 ②,同时使用call嵌套变量会将使for所能使用的变量名减少,例如使用了call set a=%%%%a:~%%b%%,%%c%%%%%%,意味for 就不能使用%%a、%%b、%%c。 所以在实际使用中,尽量使用变量延迟和for来替代call做变量嵌套。




2010-6-1 16:20
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
onlyu2000
新手上路





积分 15
发帖 14
注册 2008-9-2
状态 离线
『第 10 楼』:  

发现把原来的: set var=!FN:~0,!pos!! 改到另一文件里面:@set var=!FN:~0,%pos%! 然后再调用这个批处理就可以了。 nickwu的方法都在一个文件里面比较简洁,而且这种把call嵌套和%转义用得出神入化的方式我还需要慢慢理解 -_-!! ============================ LZ的方法放到FOR循环中有效吗? [ Last edited by onlyu2000 on 2010-6-1 at 16:32 ]


2010-6-1 16:23
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: