Board logo

标题: [数值计算] 批处理在变量后面加一段字符,有更好的方法么? [打印本页]

作者: raymai97    时间: 2011-11-14 10:28     标题: 批处理在变量后面加一段字符,有更好的方法么?

这次标题实在难写~

据大家所知,如果要更换"a"的变量,就可以用
  1. set a=123
复制代码
来改变
如果要在"a"的变量上进行计算,增加"123",就可以用
  1. set /a a+=123
复制代码
但如果要在"a"的变量上加入一段字符,而不是更换,本人只想到一个方法:
  1. set a=%a%123
复制代码
但这个方法在变量名很长(比如"happyfamily")的情况下,就会很明显地增加批处理的大小了~
不懂前辈们有没有更好的方法?

按“发表”前还想到一个方法,就是用for:
  1. for %%i in ("%happyfamily%") do (
  2. set happyfamily=%%i123
  3. )
复制代码
但感觉没解决到问题
作者: JooKin    时间: 2011-11-14 11:22

变量名很长能明显增加批处理的大小?你用一串for貌似增加的更多吧。
不过我感觉for可以这样:
  1. setlocal enabledelayedexpansion
  2. for %%i in (happyfamily) do (
  3.         set %%i=!%%i!123
  4. )
复制代码

作者: CrLf    时间: 2011-11-14 23:14

为什么非要用长变量名呢?
语块之外的情况可以考虑嵌套,不过不嫌麻烦吗:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "a=^!happyfamily^!"
  4. set happyfamily=abc
  5. echo 整容前:%happyfamily%
  6. set %a:!=%=%a%123
  7. echo 整容后:%happyfamily%
  8. 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

至于算法就有点抽象了,一方面考验你对命令的熟悉程度(基础运用以及命令的细节),一方面考验你的想象力,另一方面还考验了你的眼界(所以看到没见过的好算法时就把它记住吧),好的算法要么高效要么简洁,举个例子:
  1. for /f %%a in (1.txt) do (
  2.     for /f %%b in (2.txt) do if %%a==%%b echo %%b
  3. )
复制代码
  1. for /f %%a in (1.txt) do findstr "%%a" 2.txt
复制代码
可以改成:
  1. setlocal enabledelayedexpansion
  2. for /f %%a in (1.txt) do set "str=!str! %%a"
  3. findstr "!str!" 2.txt
复制代码
也可以改成:
  1. (for /f %%a in (1.txt) do echo %%a)>key.txt
  2. findstr /g:key.txt 2.txt
复制代码
后两种都比前两种要高效得多,为什么?因为第一种的循环次数是 "1.txt 有效行数"*"2.txt 有效行数",而第二种里用的 findstr 则是外部命令,每次使用时 cmd 都要开一个名为 findstr.exe 的子进程,所以这两种算法都是比较差的算法。
后两种之所以高效,是因为它们循环次数少,而且外部命令也只是各使用了一次,效率大大提高,这种算法就比前两种要好得多。
作者: raymai97    时间: 2011-11-15 15:24

回复 7# CrLf
  1. setlocal enabledelayedexpansion
  2. for /f %%a in (1.txt) do set "str=!str! %%a"
  3. findstr "!str!" 2.txt
复制代码
这个代码让我想起了cpaint,一次搞定,效率就是不一样,如果没猜错,你这个的原理大概也和
  1. set /p a=
  2. set /p b=
  3. ::if %a%=a and %b%=b echo yes
  4. if "%a% %b%"=="a b" echo yes
复制代码
一样吧~ 你这个代码就是先读完txt,再一次判断吧~

前阵子还看到一个代码,大概是这样的:
  1. set debug=0
  2. 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