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

[系统相关] 批处理echo和重定向符怎样把数字写入文件?

方案一:
  1. @echo off
  2. set m=1
  3. set n=2
  4. echo just a test:>test.ini
  5. echo m = %m%>>test.ini
  6. echo n = %n%>>test.ini
  7. set m=
  8. set n=
  9. pause
复制代码

方案二:
  1. @echo off
  2. set m=1
  3. set n=2
  4. echo just a test:>test.ini
  5. echo m = %m% >>test.ini
  6. echo n = %n% >>test.ini
  7. set m=
  8. set n=
  9. pause
复制代码


测试结果:
方案一不能将m和n保存到test.ini
方案二可以保存,但是行尾多了个空格
我希望是能保存,但不要多个空格

是不是跟m和n两边的百分号有关?

TOP

我估计是
我换成这种方案也能成功
  1. @echo off&setlocal EnableDelayedExpansion
  2. set m=1
  3. set n=2
  4. echo just a test:>test.ini
  5. echo m = !m!>>test.ini
  6. echo n = !n!>>test.ini
  7. set m=
  8. set n=
  9. pause
复制代码
有人能给个解释吗?
我希望用方案一来做

TOP

这能跟变量延迟有关系?  也太扯了吧,根本没用变量延迟呀

   还的脸是在存%M% %N%  还是存1 2  说了半天和没说一样
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

回复 1楼 的帖子

1和2在批处理默中有默认用途,1代表把正确输出定向到指定端,2代表把错误输出定向到指定端,所以在输出m和n的时候,因为你的那两句代码本身无错,而你把m赋值为1,便可以把“m="输出,而由于n赋值为2,此时输出的便是空白。在百分号之后加了空白以后就可以,说白了就是语法问题。
Still with wax

TOP

回复 3楼 的帖子

用变量延迟可以达到效果是因为你延迟了变量的扩展。其实理解变量延迟很重要。延迟指的是延迟扩展,言下之意故意让变量在批处理第一轮语义解析之后才扩展。这样好好看看延迟变量扩展,我也很久没学习了,不太记得了,大意是这样,论坛上有,你一搜就可以找到,很有用的,就看你耐不耐心了。你试着把@echo off这条命令去掉,在执行窗口看没一条的执行可以发现很多东西。比如你这个用变量延迟的脚本也可以那样,有助于帮助你理解为什么这样可以正确输出。!m!达到了先解释>>语义在扩展变量为1的效果。
Still with wax

TOP

原帖由 Lumiere 于 2011-2-21 14:26 发表
1和2在批处理默中有默认用途,1代表把正确输出定向到指定端,2代表把错误输出定向到指定端,所以在输出m和n的时候,因为你的那两句代码本身无错,而你把m赋值为1,便可以把“m="输出,而由于n赋值为2,此时输出的便是 ...


1和2在批处理中有默认用途
可是我用3和4也不行啊
请看方案四
  1. @echo off
  2. set m=3
  3. set n=4
  4. echo just a test:>test.ini
  5. echo m = %m%>>test.ini
  6. echo n = %n%>>test.ini
  7. set m=
  8. set n=
  9. pause
复制代码

测试显示也没降3和4写到test.ini
这个又是怎么回事呢?

TOP

0-9都是
解决办法
>a.txt echo 1
技术问题请到论坛发帖求助!

TOP

回复 7楼 的帖子

说了是语法问题,你一定要在引用变量值的时候在第二个百分号后用一个或多于一个的空格以便批处理解析语义和操作符。第一个百分号前有无空格无所谓,但是第二个后面一定要有,或者你用变量延迟也可以,但是似乎那样会降低效率吧。还有就是批处理中1代表正确输出,2代表错误输出,当不明显指定2的时候出现错误时是不会把错误信息定向输出的。再有就是高于2的好想都是代表2,也就是说明显指定要定向输出错误信息,但是你的语句没有错误,只是和你主观上有错误而凑巧语义没有问题,也就是你本来是这个目的但是批处理解释的时候按照语法解析却达到的是另一种效果,错误的效果。
Still with wax

TOP

数字后面不能直接跟重定向符,否则符号前的那个数会被当成句柄名称
可以用:
echo>1.txt 123
或者
>>1.txt echo 456

TOP

回复 3楼 的帖子

  1. @echo off
  2. set m=1
  3. set n=2
  4. echo just a test:>test.ini
  5. >>test.ini echo m = %m%
  6. >>test.ini echo n = %n%
  7. set m=
  8. set n=
  9. pause
复制代码
用方案一。
解释:关注8楼和10楼

TOP

不使用延迟变量:则%m%在预处理时被直接扩展,%m%中的数字部分被划分为重定向的句柄。解决方法,使%m%和重定向符不连在一起,例如加空格,或将重定向符前置。
开启并使用延迟变量:!m!中的数字不会被认定为句柄。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

亮点

开启并使用延迟变量:!m!中的数字不会被认定为句柄。

TOP

原帖由 zm900612 于 2011-2-21 16:56 发表
数字后面不能直接跟重定向符,否则符号前的那个数会被当成句柄名称
可以用:
echo>1.txt 123
或者
>>1.txt echo 456

数字后面当然可以跟重定向符号,只不过数字要大于9,如echo 123>a.txt就可以重定向到a.txt,因为0-9是默认的句柄。如果小于等于9的数字重定向的话,除别的方法外还可以用转义符^ ,如echo a ^2>a.txt就可以。

[ 本帖最后由 lvsehuaxue 于 2011-2-21 17:50 编辑 ]

TOP

噢,这个细节没注意过,多谢楼上指正
其实说来说起,所有的办法都围绕着预处理,只要理解了预处理机制,很多东西就一通百通了

[ 本帖最后由 zm900612 于 2011-2-21 23:04 编辑 ]

TOP

返回列表