Board logo

标题: [已结]echo %%i %%j 1 >>ok.txt为什么会把1丢失了呢 [打印本页]

作者: hhh246     时间: 2006-9-21 04:03    标题: [已结]echo %%i %%j 1 >>ok.txt为什么会把1丢失了呢

------- 1.txt  ------
154154 123 2006-9-19
4564567 321 2006-9-30
123 54 2006-10-20


for /f %%i in ('date/t') do set adate=%%i
for /f "tokens=1,2,3" %%i in (1.txt) do if %%k == %adate% echo %%i %%j 1 >>ok.txt

[ Last edited by HAT on 2008-10-15 at 23:48 ]
作者: vkill     时间: 2006-9-21 05:09
先看看你 %date/t% 是什么?
作者: electronixtar     时间: 2006-9-21 08:11
>>ok.txt echo %%i %%j 1

1>>ok.txt会把标准输出写倒ok.txt。反正 > 或 >> 前不能有数字
作者: hhh246     时间: 2006-9-21 08:12


  Quote:
Originally posted by he200377 at 2006-9-21 05:09:
先看看你 %date/t% 是什么?

当前日期 设置到变量 如 adate=2006-09-20
作者: hhh246     时间: 2006-9-21 08:15


  Quote:
Originally posted by electronixtar at 2006-9-21 08:11:
>>ok.txt echo %%i %%j 1

1>>ok.txt会把标准输出写倒ok.txt。反正 > 或 >> 前不能有数字

去了1 也不行呀
作者: pengfei     时间: 2006-9-21 09:09
根据楼主1.txt的内容修改代码如下:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=- " %%i in ('date/t') do (
    set age=%%i
    set /a month=1%%j-100
    set /a daily=1%%k-100
    for /f "tokens=1,2,3" %%i in (1.txt) do (
        if /i "%%k"=="!age!-!month!-!daily!" (
            echo %%i %%j 1 >>ok.txt
        )
    )
)

问题出在格式上, 导致if语句判断出错不能执行重定向.
作者: namejm     时间: 2006-9-21 09:15
  %date%的格式是 2006-09-19,而非1.txt中的2006-9-19,所以,你的代码中,if语句无论如何都不能成立;

  另外,echo %%i %%j 1 >>ok.txt的格式是错误的,最后的1被CMD认为是句柄值,会导致没有任何内容输入到ok.txt。electronixtar 在『第 3 楼』所说的:> 或 >> 前不能有数字 一句是不够准确的,准确的说法是:如果echo最后一列的数字是0~9中的任何一个数字,将不会把内容写入ok.txt中
作者: hhh246     时间: 2006-9-21 09:15
真高手,已解决
作者: pengfei     时间: 2006-9-21 09:22
  另外,echo %%i %%j 1 >>ok.txt的格式是错误 ... [/quote]

好像并没有飞扬兄说的这种错误, 如果0-9是单独的将会认为是句柄, 而这个重定向前跟了几个值, 所以不会出现兄所说的这种情况!
作者: namejm     时间: 2006-9-21 09:29
  我所说的错误,并非执行的时候会出错,而是说写到ok.txt中的内容并非你想要的完整内容,比如,你可以运行语句 echo 123 1>ok.txt 试试,在ok.txt中并不是你想要的 123 1,而是 123,少了最后一列的数字1。
作者: hhh246     时间: 2006-9-21 09:30
多试过1 后加一个空格可以解决
作者: pengfei     时间: 2006-9-21 09:33
呵呵~  namejm兄说的对.

楼主的后面加空格解决了无法重定向问题...
作者: namejm     时间: 2006-9-21 09:47
  如果要求不是太苛刻的话,是可以在最后一列的数字后加个空格来避免CMD的识别问题,但是,如果要求非常苛刻的话,比如要求最后一列数字的0~9写到文本中之后,后面不带空格的话,就应该对echo语句作一些处理,换成下列写法中的任意一种:
  1、(echo 内容)>test.txt
  2、>test.txt echo 内容
  另外,还可以用 echo ^内容>test.txt的格式,但是这个写法有很大的局限性,即转义符^只能加在内容最后一列的单个的0~9前面,如果是 echo ^123 1>test.txt 的写法,还是不成,要写成 echo 123 ^1>test.txt才可以。
作者: pengfei     时间: 2006-9-21 09:49
是的, 出现这种情况尽量用字符转义...
作者: electronixtar     时间: 2006-9-21 10:35
可以用 "" 来转义——在ntcmds.chm上看到的
作者: namejm     时间: 2006-9-21 11:06
  还可以用双引号来转义?怎么个写法哦?
作者: pengfei     时间: 2006-9-21 11:12
用双引号不是转义. 只是把0-9用引号括起来, 不让系统认为是句柄.
作者: namejm     时间: 2006-9-21 11:30
  把0~9用引号括起来的办法是行不通的,因为 echo 123 "1">test.txt 的写法是把字符串 123 "1" 写入了test.txt中,而不是想要的 123 1。
作者: vkill     时间: 2006-9-22 07:45
还是这样写看的明白  >>ok.txt echo %%i %%j 1
作者: lxmxn     时间: 2006-9-22 23:22
简单的一个ECHO还有这么大的学问啊?

又长见识了~~~

:)
作者: nanhui112     时间: 2008-1-2 17:27
>>text.txt  echo 451563575 1  
还是这样的好 ,  想不到还有这样的写法。 我顶`^_^
作者: haiou327     时间: 2008-1-2 21:31
echo %%i %%j ^1 >>ok.txt
作者: luowei14     时间: 2008-10-15 21:37
还真没注意这种情况,以后得多看点资料了..