[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

回复 45楼 的帖子

我找了一下,原来是新手区的  [ 新手练习 4 ] 批处理计算字符串长度

http://www.bathome.net/viewthrea ... A4%B6%C8&page=1

其中4楼的代码中的法四:
  1. rem ----------[法四]主程序开始---------------------
  2. echo %var%>a.txt
  3. echo.>>a.txt
  4. for /f "tokens=1 delims=:" %%i in ('findstr /o .* a.txt') do set /a length=%%i-2&if not %%i  
  5. equ 0 echo 共有%length%个字符&goto end
  6. :end
  7. del a.txt
  8. rem ----------[法四]主程序结束---------------------
复制代码
这段代码中就是用减2。

而且你在14楼说是减2就是减去回车和换行。
(*^_^*)

TOP

回复 46楼 的帖子

那个是通过判断文件大小来计算字符串长度的,跟你在40楼提出的问题略有不同。我们还是以你40楼的问题来讨论一下吧。

(echo "bathome"&echo.)|findstr /o ".*"的结果你已经看到了,就是:

0:"bathome"
12:

这个命令用在for里面,得到的效果就是set /a length=12-5,为什么减去5呢?

findstr /o计算的是偏移量,偏移量从零开始,一对双引号+字符串bathome这7个字母+回车+换行,总共11个,下一个偏移量自然是12,因此要想用这个方法得到字符串bathome的长度就需要减去5。

--------------------------------------------

以上为错误言论,请忽略。解释见49楼。


[ 本帖最后由 Batcher 于 2009-4-20 19:17 编辑 ]
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 47楼 的帖子

非常感谢batcher,这么有耐心回答我的疑问,但是我还是没明白它跟输入到文件,再读出来的时候,为什么不一样?
(*^_^*)

TOP

直接输出在con设备上,会有一个控制字符,所以要减3,而在文件中,只有cf跟lf,减2就可以了

TOP

回复 48楼 的帖子

当我们把字符串重定向输出到文件中再计算偏移量的情况,比较好理解,多出来的两个字节就是行尾的回车和换行。

当我们直接在for命令中获取字符串偏移量时,情况会变得稍微复杂。请把一下代码保存为test.bat,然后运行。
  1. (echo BatHome&echo.)|findstr /o ".*"
  2. pause
复制代码
结果如下:
C:\Test>(echo BatHome  & echo.)  | findstr /o ".*"
0:BatHome
10:

请注意,实际运行时,命令行解释器在&符号前面添加了两个空格(通常情况下,命令分隔符是一个空格),这多出来的一个空格就导致了偏移量增加了一个,这就是我们在计算字符串BatHome长度的时候需要减去3的原因。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set /p a=请输入要计算长度的字符串:
  4. for /l %%a in (1,1,1000000) do (
  5. set k=!a:~%%a,1!
  6. if not defined k (
  7. echo 字符串长度:%%a
  8. pause>nul
  9. exit
  10. )
  11. )
复制代码

[ 本帖最后由 lxzzr 于 2009-4-23 03:13 编辑 ]

TOP

楼上的,等半天都算不出来,
其实set /p输入的行最大为1024字符,变量长度也只有8189 个字符,没必要1000000,

for /l 在预处理时会首先按数分配完后才一条条执行的,分配时也是要时间的,大概是80次等一个set a=a的执行时间。

TOP

原帖由 Batcher 于 2009-4-20 19:29 发表
当我们把字符串重定向输出到文件中再计算偏移量的情况,比较好理解,多出来的两个字节就是行尾的回车和换行。

当我们直接在for命令中获取字符串偏移量时,情况会变得稍微复杂。请把一下代码保存为test.bat,然后运 ...


cmd下输入echo a            >1.txt
打开1.txt,ctrl+A
cmd下输入echo a>2.txt
打开2.txt,ctrl+A

同理
(echo bathome&echo.)>1.txt



(echo.&echo.&echo.)|findstr /o .*
这个多出来的字符不是空格,是一个控制符,推测是行输出的eof标志

TOP

回复 53楼 的帖子

行结束符应该是eol而不是eof吧?
不过这个推测似乎缺乏证据的支持。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 Batcher 于 2009-4-30 22:46 发表
行结束符应该是eol而不是eof吧?
不过这个推测似乎缺乏证据的支持。


确定不知道具体是啥,嘿嘿
我刚发现这个时也有过讨论,记得有人分析过

(echo.abc&echo.) >1.txt
不带空格
(echo.abc&echo.)|more >2.txt
带上了空格

(dir /b ?.txt&echo.&echo.)|findstr /o .*
显示的结果为
0:1.txt
7:2.txt //+2
14: //+2
17: //这里是多3
最后假设多出来的一个字符是echo的特殊控制符,在con设备上被忽略,但通过管道符就成了可见,在debug下查看就显示为20

TOP

同意楼上的观点,命令行与参数是会有一个空格分开的,并不是连在一起的。

TOP

回复 55楼 的帖子

  1. (echo TestStr&echo.)|findstr /o ".*">a.txt
复制代码
我们把结果输出到文件里面,可以清楚的看到行尾多出来的那个字符就是一个空格(十六进制编辑器下显示为20)。

[ 本帖最后由 Batcher 于 2009-5-5 13:36 编辑 ]
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 3楼 的帖子

可以不用第三行代码
  1. for /f "tokens=*" %%a in ('dir x.x /-c ^|find " 字节" ^|find /v ":"') do (
复制代码
中的
  1. ^|find /v ":"
复制代码


不知道这句有什么作用?

修改楼主代码:
  1. @echo off
  2. echo i like the bathome,because here is the batch of the world.>x.x
  3. for /f "tokens=*" %%i in ('dir x.x /-c^|find " 字节"') do (
  4.     for /f "tokens=3" %%j in ('echo %%i') do (
  5.         set /a len=%%j-2&call,echo %%len%%&del x.x /q
  6. ))&pause
复制代码


请指正!

[ 本帖最后由 keen 于 2009-5-11 23:11 编辑 ]
(*^_^*)

TOP

1.1
既然楼主说没有超过80个字符,所以:
  1. @echo off
  2. set "str=i like the bathome,because here is the batch of the world."
  3. for /l %%i in (0 1 80) do (
  4.     call,set var=%%str:~%%i,1%%
  5.     if not defined var set n=%%i&goto end
  6. )
  7. :end
  8. echo %n%&pause
复制代码

[ 本帖最后由 keen 于 2009-5-11 23:40 编辑 ]
(*^_^*)

TOP

re 58,59楼

写到临时文件的话,这样就可以了,dir + find 效率太低了
  1. @echo off
  2. echo i like the bathome,because here is the batch of the world.>x.x
  3. for %%a in (x.x) do set/a n=%%~za-2
  4. echo %n%
  5. pause
复制代码
80字符以内可以这样,是否更好一点呢?
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=i like the bathome,because here is the batch of the world."
  3. for /l %%i in (0 1 80) do (if "!str:~%%i,1!" equ "" set n=%%i&goto end)
  4. set n=0
  5. :end
  6. echo %n%&pause
复制代码

[ 本帖最后由 netbenton 于 2009-5-11 23:31 编辑 ]

TOP

返回列表