标题: [数值计算] 批处理在变量后面加一段字符,有更好的方法么? [打印本页]
作者: raymai97 时间: 2011-11-14 10:28 标题: 批处理在变量后面加一段字符,有更好的方法么?
这次标题实在难写~
据大家所知,如果要更换"a"的变量,就可以用复制代码
来改变
如果要在"a"的变量上进行计算,增加"123",就可以用复制代码
但如果要在"a"的变量上加入一段字符,而不是更换,本人只想到一个方法:复制代码
但这个方法在变量名很长(比如"happyfamily")的情况下,就会很明显地增加批处理的大小了~
不懂前辈们有没有更好的方法?
按“发表”前还想到一个方法,就是用for:- for %%i in ("%happyfamily%") do (
- set happyfamily=%%i123
- )
复制代码
但感觉没解决到问题
作者: JooKin 时间: 2011-11-14 11:22
变量名很长能明显增加批处理的大小?你用一串for貌似增加的更多吧。
不过我感觉for可以这样:- setlocal enabledelayedexpansion
- for %%i in (happyfamily) do (
- set %%i=!%%i!123
- )
复制代码
作者: CrLf 时间: 2011-11-14 23:14
为什么非要用长变量名呢?
语块之外的情况可以考虑嵌套,不过不嫌麻烦吗:- @echo off
- setlocal enabledelayedexpansion
- set "a=^!happyfamily^!"
- set happyfamily=abc
- echo 整容前:%happyfamily%
- set %a:!=%=%a%123
- echo 整容后:%happyfamily%
- pause
复制代码
作者: raymai97 时间: 2011-11-15 00:09
回复 3# CrLf
制作比较大的批处理时,为了比较容易分析,都使用比较长的变量名
作者: CrLf 时间: 2011-11-15 00:32 标题: 标题
回复 4# raymai97
那建议用特殊字符@#$之类的既显眼又简洁,话说长代码一定要有注释,否则哪怕变量名再明显,也难以迅速了解代码的逻辑结构
作者: HAT 时间: 2011-11-15 09:40
提高自己的水平,从算法提高代码效率,比瞎折腾更有意义。
作者: CrLf 时间: 2011-11-15 12:34
我也觉得楼主现在的问题主要是算法...
批处理和别的语言或脚本不一样,它是短小简便的,不需要太复杂的变量环境,而且变量长度也会在一定程度上影响运行效率,所以我们一般都用简写,比如我个人就偏爱 a、b、c、m、n、str、var、@1、@2、@3、tmp 这样简洁的变量名。
你可以看看别人写的批,短小的变量名若使用得当,同样可以申明它的功能
批处理获取指定天数之前的日期
http://bbs.bathome.net/thread-3330-1-1.html
至于算法就有点抽象了,一方面考验你对命令的熟悉程度(基础运用以及命令的细节),一方面考验你的想象力,另一方面还考验了你的眼界(所以看到没见过的好算法时就把它记住吧),好的算法要么高效要么简洁,举个例子:- for /f %%a in (1.txt) do (
- for /f %%b in (2.txt) do if %%a==%%b echo %%b
- )
复制代码
或- for /f %%a in (1.txt) do findstr "%%a" 2.txt
复制代码
可以改成:- setlocal enabledelayedexpansion
- for /f %%a in (1.txt) do set "str=!str! %%a"
- findstr "!str!" 2.txt
复制代码
也可以改成:- (for /f %%a in (1.txt) do echo %%a)>key.txt
- findstr /g:key.txt 2.txt
复制代码
后两种都比前两种要高效得多,为什么?因为第一种的循环次数是 "1.txt 有效行数"*"2.txt 有效行数",而第二种里用的 findstr 则是外部命令,每次使用时 cmd 都要开一个名为 findstr.exe 的子进程,所以这两种算法都是比较差的算法。
后两种之所以高效,是因为它们循环次数少,而且外部命令也只是各使用了一次,效率大大提高,这种算法就比前两种要好得多。
作者: raymai97 时间: 2011-11-15 15:24
回复 7# CrLf - setlocal enabledelayedexpansion
- for /f %%a in (1.txt) do set "str=!str! %%a"
- findstr "!str!" 2.txt
复制代码
这个代码让我想起了cpaint,一次搞定,效率就是不一样,如果没猜错,你这个的原理大概也和- set /p a=
- set /p b=
- ::if %a%=a and %b%=b echo yes
- if "%a% %b%"=="a b" echo yes
复制代码
一样吧~ 你这个代码就是先读完txt,再一次判断吧~
前阵子还看到一个代码,大概是这样的:- set debug=0
- if "%debug%"=="1" (set "mark=") else (set "mark=rem")
复制代码
都是些很有趣的方法~
其实前阵子还用cpaint重做了3D按钮代码,配合mouse.exe和eudc.exe,可以高仿98按钮了(按下去真的有3d效果)~ cpu占用来可以,但是也因为用了很长的变量名,导致代码2KB以上
做好了,才发现,真的有用么?除非我可以搞到些有用的东西,并可以很好地和我这个代码配合,否则都是浮云啊~
最近在研究如何在批处理里调用openfiledialog控件,目前找不到完美的方法,还发现VBS也好不到哪里去,很多可以在xp下用的控件在win7就不好使了~
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |