[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  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: 熟视无睹不代表不是问题,提得有道理PB + 30 技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 Batcher 于 2010-4-27 17:54 发表
顶楼内容里面的findstr /l不一定能够解决汉字“或”的问题,测试环境:XP SP3 Pro CS,测试结果:

C:\Test>type a.txt
我们
他们
123

C:\Test>findstr /l "我们 他们" a.txt

C:\Test>findstr /r "我们 他们" a.txt
我们
他们

C:\Test>findstr "我们.* 他们" a.txt
我们
他们

请注意,你这里使用的是 /l 而不是 /i,前者是按字符搜索的意思,后者是不区分大小写的意思。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 47楼 的帖子

我举得例子是针对楼主的这句:
finstr在匹配多个中文串时存在问题,使用开关/l或者/r可以得到正确的输出。

楼主在这里没有提到/i啊
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 46楼 的帖子

早就习惯了变量的这种扩展形式
忘了这也是不符合大多数人的认知习惯的
其实关于增强的变量扩展方面
负值的使用也在挑战大多数人的认知

使用正值就是起始的偏移量+长度
使用负值却不是起始的反向偏移量+反向长度
而是起始的反向偏移量+终止的反向偏移量

我最初在理解set的这句说明了
也还纳闷了老半天
为什么呢?

这大概说明了
增强的变量扩展在对正值和负值的处理上
采用了完全不同的两种处理逻辑
所以正值超出后为空
而负值超出后为首字符地址的逻辑
也就不难理解了
天的白色影子

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

TOP

回复 50楼 的帖子

这是可以理解的

%%i是dir的原样输出
所以受到dir/l的控制
而%%~nxi是扩展输出
是受到变量扩展逻辑控制的

dir/s/b将给出文件的完整路径
而在%%~nxi扩展时能根据路径找到文件
自然会把变量当作文件名处理
所以是文件自身的大小写状态

没有/s将只给出文件名
而如果当前路径不是dir的路径
则%%~nxi没有办法找到对应文件
自然只有按“当前路径+替代变量“的形式扩展
所以是替代变量%%i原来的大小写状态
天的白色影子

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

md .\%input%是什么意思

TOP

太多深奥的东西了,诡异的预处理,甚至微软本身的一些奇怪逻辑,批处理是个大坑。

TOP

回复 1# qzwqzw
帮助很大

TOP

华山论剑,高手过招够精彩

TOP

返回列表