[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
“〇”算不上特殊字符,但在936代码页(默认),xp sp3系统下,if 会认定该字符为空。
http://bbs.bathome.net/viewthrea ... ight=%2Bhanyeguxing
  1. @echo off
  2. if "〇"=="" (echo 〇为空)else echo 〇不为空
  3. if "12〇34"=="1234" (echo 相同)else echo 不同
  4. if 12〇34==1234 (echo 相同)else echo 不同
  5. pause
复制代码
1

评分人数

    • qzwqzw: 谢谢参与,已加入技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

1,关于变量延迟的特例:
  1. @echo off
  2. set n=1&if defined n echo.定义了变量n,即变量n存在
  3. set/a n+=1,n=n+7
  4. echo.%n%
  5. pause
复制代码
对于 if defined 和 set/a ,不使用%或!括变量,无论是否开了变量延迟,变量本身都会被延迟扩展。如果换成其它写法,就需要开启变量延迟,如:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1&if not "!n!"=="" echo.定义了变量n,即变量n存在
  3. set/a n=%n%+1&set/a n=!n!+7
  4. echo.%n%
  5. pause
复制代码
2,关于表达式分隔符,:

以上面的批处理为例,是不可以写成:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1&if not "!n!"=="" echo.定义了变量n,即变量n存在
  3. set/a n=%n%+1,n=!n!+7
  4. echo.%n%
  5. pause
复制代码
即用,连起来的表达式,无论是否开了变量延迟,只要这个变量被用!括起来,!n!都不会动态扩展分隔符,前n的变化。
即 set/a n=%n%+1&set/a n=!n!+7 和 set/a n=%n%+1,n=!n!+7 并不等效;
set/a n=n+1,n=n+7set/a n=%n%+1,n=!n!+7 也不等效。
所以:在一个用分隔符 , 连起来的表达式中,!括变量并不能动态扩展该变量在,前的变化,去掉这个!才可以动态扩展该变量在,前的变化。

[ 本帖最后由 hanyeguxing 于 2010-4-17 15:39 编辑 ]
1

评分人数

    • qzwqzw: 谢谢提供,准备加入逗号表达式的部分技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 qzwqzw 于 2010-4-17 17:54 发表
变量延迟的特例我需要考虑一下
因为从我的理解
这些语法特性都可以理解
算不上“奇诡”
if defined 和 set /a因为都是在内部处理变量
而不是在预处理过程中处理
也就是说不需要使用变量扩展标记
所以天然具有变量延迟的特性

至于逗号表达式
这是set /a才能处理的特性
cmd的预处理过程
是把两个表达式理解为一句
而不是一个语句块
所以自然不可能延迟扩展变量
...
这个我同意,当初自学的时候,我绕了好大一个圈子才明白过来
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

有一个问题算不上诡异,但多数新手却很容易找不到错误的原因:
  1. set a=
复制代码
这个是很多人经常用的一行代码,但却产生了一个问题。如果在这之前没有定义变量a,则这行代码后会产生%ERRORLEVEL%为1。
例如:
  1. @echo off
  2. echo.%ERRORLEVEL%
  3. set a=
  4. echo.%ERRORLEVEL%
  5. pause
复制代码
这将直接干扰后面对%ERRORLEVEL%的使用

[ 本帖最后由 hanyeguxing 于 2010-4-20 19:20 编辑 ]
1

评分人数

    • qzwqzw: 决定采用,以资鼓励技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

你该用set/a "n=寒夜孤星"去实验,嘿嘿
在sp3下,set/a首先判断是否是数字(第一个字符是否是数字或数字符号),然后判断是否为有效数字
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 qzwqzw 于 2010-4-19 17:24 发表

得你提醒
又发现一系列”非奇诡“的奇诡

逐字分行又多一个思路

实际应用中受到很大的限制
1,对于ANSI编码的,必须使用cmd /u去转换
2,ANSI编码的文本内要求只能有字母、英文符号和数字
不过想到个简单的显示20个空行的方法,哈哈:
  1. fsutil file createnew uni.txt 20
  2. type uni.txt | more
复制代码

[ 本帖最后由 hanyeguxing 于 2010-4-20 18:02 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

问题在于我就是通过这个才认清more逐字分行的原因啊,嘿嘿
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 随风 于 2010-4-20 20:13 发表
又发现一个奇诡的问题
以下代码,不管是否存在a.txt都无法正确运行,把rem 换成其它的命令则可以,或去掉最外面的一对括弧也可以。@echo off
(for /f %%f in (a.txt) do echo.123&rem abc)
pause

因为)成了rem的一部分,所以for前的(就孤立了
例如:
  1. for /f %%f in (a.txt) do echo.123&rem abc&echo.这个不显示
复制代码

[ 本帖最后由 hanyeguxing 于 2010-4-20 20:33 编辑 ]
1

评分人数

    • 随风: 我怎么这都没想到呢。PB + 5
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 lxzzr 于 2010-4-20 23:15 发表
代码:

@ECHO OFF
FOR /F "DELIMS=" %%A IN ('MORE +7^<%~FS0') DO ECHO %%A
PAUSE>NUL
COPY %0 TEST.TXT>NUL
MORE +7<"TEST.TXT"
PAUSE>NUL
EXIT
;忽略1

;忽略2

忽略 ";" 开头的行和空行



尚不清楚是FOR命令还是MORE,还是管道符的作用.. ...

for的作用,例如,你在for里强制eol= 为空格,就可以看到;的内容了。
(俺错了,偷偷改过,嘿嘿)

[ 本帖最后由 hanyeguxing 于 2010-4-20 23:36 编辑 ]
1

评分人数

    • qzwqzw: 无法强制设置eol为空,参考首帖PB + 10
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off
  2. set m=1234567890
  3. echo.测试1:%m:~1,1%
  4. echo.测试2:%m:~20,1%
  5. echo.测试3:%m:~20%
  6. echo.测试4:%m:~8,-5%
  7. echo.测试5:%m:~0,1%
  8. echo.测试6:%m:~-0,1%
  9. echo.测试7:%m:~-20,1%
  10. echo.测试8:%m:~-5%
  11. echo.测试9:%m:~-20%
  12. pause
复制代码
在 XP SP3 Pro 下,显示结果:
测试1:2
测试2:
测试3:
测试4:
测试5:1
测试6:1
测试7:1
测试8:67890
测试9:1234567890
测试1、测试5、测试6、测试8,都是显示正常。
测试2、测试3,因为超出了范围,所以为空。
字符串都是从左向右截取的,所以测试4为空。
当数值为负,且超出范围时,是否也为空呢?从测试7和测试9中可以看出,显然不是。
形如%m:~-20,1%,超出范围时,依然截取并获取了最左边的字符。
形如%m:~-20%,超出范围时,总是截取并获取整个字符串。
所以:在截取字符串时,即使负的数值超出范围,依然是从最左边的字符开始截取。

[ 本帖最后由 hanyeguxing 于 2010-5-2 02:13 编辑 ]
1

评分人数

    • qzwqzw: 熟视无睹不代表不是问题,提得有道理技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

1,dir的 /l 参数是按小写字母显示未排序的目录名和文件名。/l 不会将扩展字符转换为小写字符。
2,dir的 /s 参数是列出指定目录及所有子目录中出现的每个指定的文件名。
3,%%~nxi是扩展%%i的文件名和扩展名的。(%%~ni、%%~fi等也是这样)
当这三个复合到一起,就诡异了:
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s/l/b/a "D:\rec\测试"')  do echo.%%i和%%~nxi
  3. pause
复制代码
%%i是小写的,%%~nxi却是原始的大小写
而当不使用 /s 时,%%~nx和%%i一样,都转成小写。

[ 本帖最后由 hanyeguxing 于 2010-5-6 13:57 编辑 ]
1

评分人数

    • qzwqzw: 替代变量扩展的一种延伸技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 51楼 的帖子

  1. @echo off
  2. set "r=D:\rec\abc.txt"
  3. for %%a in (0 1) do call:han %r% %%a
  4. set "r=abc.txt"
  5. for %%a in (0 2) do call:han %r% %%a
  6. pause&exit
  7. :han
  8. if %~2==1 cd.>D:\rec\ABC.txt
  9. if %~2==2 cd.>ABC.txt
  10. echo.参数%1和%~nx1与%~f1
  11. for %%i in (%~1) do echo.变量%%i和%%~nxi与%%~fi
复制代码
写了个脚本测试,发现参数和变量的替换扩展确实如是按如此规律此显示的。
  %%i 的大小写由 (set) 直接控制,但 %%~nxi 则受 for 能否在扩展中找到文件的控制。如果扩展不到该文件,则按 %%i(set) 中的赋值大小写为准;如果能够扩展到该文件,则按实际文件的大小写为准。 %%~i 例外,原因是 %%~i 直接删除 %%i 的前后引号 ("") ,而不扩展寻找文件。

  参数的增强扩展同样如此。

[ 本帖最后由 hanyeguxing 于 2010-5-6 20:49 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表