[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
原帖由 pusofalse 于 2008-8-3 18:40 发表
@echo off
for /f "delims=" %%. in (1.txt) do (
   set "str=%%."
   call,set "str=%%str:*a=%%"
   for /f "delims=a" %%{ in ("%%.") do (
         set "var=%%{"
        call,echo.%%var:0=%%a%%str%% ...


请高手帮忙解释一下可以吗,我对里面的一些语法不太了解
像上面的"delims="这样的分隔符是代表什么意思,还有这个%%.这又是什么意思,同样,还有下面的%%{

TOP

"delims="    取消以空格作为分隔符
%%.
%%{
之类的你可以看作%%i   %%a
不大可能的事也许今天实现,根本不可能的事也许明天会实现

TOP

原帖由 ieutk 于 2008-8-6 15:12 发表
"delims="    取消以空格作为分隔符
%%.
%%{
之类的你可以看作%%i   %%a


"delims="    取消以空格作为分隔符[不太明白]
那这种形式一般是用在什么样的场合呢,具体的作用又是什么,可以结合例子说明一下吗?

感谢!

TOP

  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do (
  3. set a=%%i
  4. setlocal enabledelayedexpansion
  5. for /l %%i in (1 1 10) do (
  6. set a=!a:0a=a!
  7. )
  8. echo !a!
  9. endlocal
  10. )
  11. pause
复制代码

TOP

楼上的朋友,测试果真正确吗。
心绪平和,眼藏静谧。

TOP

只看delim这个单词是分隔的意思。
它用在for的选项中当然就是指定分隔符的意思,看其后的s,可以指定不止一个。
举个例子就简单了。从文件中取值。
a.txt
  1. bbs bat home
复制代码
你知道从a.txt中提取出bat 是用for /f "tokens=2 delims= " %%a in (a.txt) do @echo %%a
红色那处(包括=之后的空格)可有可无,因为for 默认就是以空格或跳格或等号作为分隔符的。
以XP中文版为例,提取出当前时间,并输出如下形式yyyymmdd
for /f "tokens=1-3 delims=- " %%a in ('date/t') do @echo %%a%%b%%c
"tokens=1-3 delims=- " 取命令结果中的1-3列,看下命令结果只有两列,如何做呢,就要用delims制定分隔符了,分隔符多指定一个- 看下,不就变成4列了吗。delims=-之后有空格,否则,第三列会是这样06 星期三,而不会再以空格作为分隔符,06为当前日期。
加深。
a.txt
  1. abcdefghijkl
复制代码

只提取出hijkl
  1. for /f "tokens=2 delims=g" %%a in (a.txt) do @echo %%a
复制代码


%%{ %%.这样的非常少见,所以说怪异。
for /f "tokens=1-31" %%a in (a.txt) do echo %%a...%%z...
超过z之后要用{表示。
for中的变量顺序完全是由ASSCII码的大小来排列的。
for /f "tokens=1-3" %%" in (a.txt) do @echo %%"...
其后要用什么表示呢。
看下,"的十进制asscii为34,只需知道哪个是35,36 就可以输出第2-3列了。
十进制asscii对应35,36的分别是# $
但"是特殊字符,其前要加^转义。所以这个例子中,若全部输出1-3列,正确的应该是
  1. for /f "tokens=1-3" %%^" in (a.txt) do @echo %%^" %%# %%$
复制代码

[ 本帖最后由 pusofalse 于 2008-8-6 20:25 编辑 ]
心绪平和,眼藏静谧。

TOP

明白了,我上面只是对"delime="不太理解,版主是个好心的同志哇,讲得这么细,感谢

昨天自己写了个测试代码运行了一下已经完全明白了。

for /f %%i in ('dir') do @echo %%i  
测试运行结果:
驱动器
卷的序列号是
C:\Documents
2008-08-05
2008-08-05
2008-04-24
2008-08-03
2008-04-24
2008-08-02
0
6

for /f "delims=" %%i in ('dir') do @echo %%i
运行结果:
驱动器 C 中的卷是 WINXP
卷的序列号是 9CAA-3031
C:\Documents and Settings\Administrator 的目录
2008-08-05  11:20    <DIR>          .
2008-08-05  11:20    <DIR>          ..
2008-04-24  18:01    <DIR>          Favorites
2008-08-03  00:50    <DIR>          Phone Browser
2008-04-24  15:29    <DIR>          「开始」菜单
2008-08-02  23:23    <DIR>          桌面
               0 个文件              0 字节
               6 个目录  6,371,704,832 可用字节

我从两个结果的对比中得到的理解即为:
不加"delims="这个参数的话,for 就会默认以空格作为分隔符(这样就只会显示左边的一列所返回的结果),加上这个参数可以取消以空格作为分隔符。

TOP

%%{ %%.这样的非常少见,所以说怪异。
for /f "tokens=1-31" %%a in (a.txt) do echo %%a...%%z...
超过z之后要用{表示。
for中的变量顺序完全是由ASSCII码的大小来排列的。
for /f "tokens=1-3" %%" in (a.txt) do @echo %%"...
其后要用什么表示呢。
看下,"的十进制asscii为34,只需知道哪个是35,36 就可以输出第2-3列了。
十进制asscii对应35,36的分别是# $
但"是特殊字符,其前要加^转义。所以这个例子中,若全部输出1-3列,正确的应该是
复制内容到剪贴板代码:

for /f "tokens=1-3" %%^" in (a.txt) do @echo %%^" %%# %%$


对于版主同去对于这部分的解释,我也明白了,十分感谢。。。

不过我也产生了一个疑问,
@echo off
for /f "delims=" %%. in (1.txt) do (
   set "str=%%."
   call,set "str=%%str:*a=%%"
   for /f "delims=a" %%{ in ("%%.") do (
         set "var=%%{"
        call,echo.%%var:0=%%a%%str%% ...
按照我的理解来说,这里的%%{  %%.跟%%a %%b并没有什么实质上的不同啊,那为什么要用在这里呢??

TOP

a00000008
9楼的代码在处理上面的情况时不理想

TOP

回复 24楼 的帖子

多谢兄弟指出。我明天再来看下哪里出错了,今天太累了,不好意思。
心绪平和,眼藏静谧。

TOP

前面几个测试后 或多或少的有些问题  写一个
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('more/e +9 %0') do (
  3.    set "str=%%i"
  4.    call set "var=%%str:*a=!str!a%%"
  5.    call set "var=%%var:!str!=%%"
  6.    if not "!var!"=="" (
  7.    call set "var1=%%str:!var!=%%"
  8.    set "var1=!var1:0=!"&echo !var1!!var!) else echo %%i)
  9. pause>nul&exit
  10. 560000h57
  11. 0000acb0ha22a
  12. 0b0c00a00a0s
  13. 0000h00ga0a0
  14. a00000000a
  15. 0000h00g200
  16. 00000000a0a
  17. a00000000
  18. 00000000a
  19. aaaaa
复制代码

TOP

去if,增强代码的健壮,测试代码:
  1. @echo off
  2. for /f "delims=" %%c in (1.txt) do (
  3. for /f "delims=a tokens=1,*" %%i in ("0%%c") do (
  4. set var=%%i
  5. call echo.%%var:0=%%a%%j
  6. ))
  7. pause>nul
复制代码

TOP

不过话说回来,题目有很多细节没说清楚
如,a的个数?a的大致位置?等等问题

其实,所谓的通用代码一般都是比较累赘的,所以写的代码一般都具有很强的针对性

TOP

原帖由 youxi01 于 2008-8-8 00:39 发表
去if,增强代码的健壮,测试代码:@echo off
for /f "delims=" %%c in (1.txt) do (
        for /f "delims=a tokens=1,*" %%i in ("0%%c") do (
                set var=%%i
                call echo.%%var:0=%%a%%j
))
pause>nul

原文本没有a的行会去掉不应去掉的0
在原文本全a的行只显一个a

TOP

我不明白为什么我的代码不正确,
只是针对你题目而已。
其实想要做到通用只要计算最长字符的长度即可。

TOP

返回列表