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

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

TOP

原帖由 null 于 2008-8-2 01:15 发表
我失败了,但我有个问题
我的测试代码如下:
@echo off
for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
set a=%%i
set a=%a:0=%
echo %a%a%%j
)

结果为:

acb0h
a000s
a00
a


在CMD中运行
...

你的这两个代码输出的结果是理所当然的。第一个因为没有开启变量延迟,即使开启了,输出的结果也不会正确。
第二个。你测试如下代码。
  1. set a=0b0c00a000s&echo %a%
  2. pause
复制代码
保存为bat。运行,你会发现a的值并不是你所想的那样,而是显示echo处于关闭状态。
这是因为CMD命令解释器在读到set a=0b0c00a000s&echo %a%这一条完整的语句时,发现a用%%闭合,是个变量,会把它替换成之前所赋给它的字符串常量,并把它打印出来。而在这条完整的语句之前并没有给a赋值,即是空值。所以才会显示echo处于关闭状态。请理解“一条完整的语句”的意思。
set a=0b0c00a00s&echo %a% 这才是一条完整的语句。
同样的,for语句中给a赋值,然后又在for中引用%a%,在这之前,CMD早就把它替换为空值了,所以你的代码会出错。
如何避免这种出错呢,要用到变量延迟了。
setlocal enabledelayedexpansion 这条语句的意思即是开启变量延迟。它的作用就是要告诉CMD,在读到一条完整的语句时,不要急匆匆地扩展变量。而是在执行复合语句(for语句或if语句中其后用一对圆括号闭合的所有语句称为复合语句,用&或&&连接的也是复合语句。)中的某单条语句之后,再执行变量的扩展,也就是说,这个变量扩展的行为被延后了。在开启延迟之后,在for中给变量a赋值,又在for中引用a,此时,就不应用%%将其闭合了,而是用!!。
你的代码应该是这样。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
  3. set a=%%i
  4. set a=!a:0=!
  5. echo !a!a%%j
  6. )
  7. pause
复制代码
但输出的结果仍不符合楼主的要求,这就要看你的了。

还要记得,如果在复合语句之外再次引用变量,此时它的值是在复合语句之内最后得到的值。
如下代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (100 1 199) do set var=%%a&echo !var:~1!
  3. echo %var%
  4. pause
复制代码
关于变量延迟,搜索一下,多做测试很快就能明白了,我说的很粗糙。

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

TOP

  1. @echo off
  2. for /f "delims=" %%. in (1.txt) do (
  3.    set "str=%%."
  4.    call,set "str=%%str:*a=%%"
  5.    for /f "delims=a" %%{ in ("%%.") do (
  6.          set "var=%%{"
  7.         call,echo.%%var:0=%%a%%str%%
  8.   ))
  9. pause>nul
复制代码


来个怪异的。^_^
3

评分人数

    • ieutk: 代码简洁,通用PB + 12
    • more: PB + 6
    • batman: 充分利用delims,好!PB + 10
心绪平和,眼藏静谧。

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

回复 24楼 的帖子

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

TOP

返回列表