for命令的一些bug分析

1、关于冒号:当某行内容以 : 打头时,用 for /f "tokens=1* delims=:" %%i in ('findstr /n .* test.txt') do echo.%%j 会把 :
过滤掉;

  2、关于分号:findstr .* test.txt 可以把以分号打头的行完整显示出来,但是,用在for语句中就不能找到了,必须加上参数/n才可以
,似乎是for语句会把以分号打头的行当作注释内容忽略掉,好象不是findstr的错;而不放在for语句中的 type、more和findstr都是可以的;

  解决问题1和问题2的方案有:

稍微复杂一点的:

@echo off
:: 不会忽略空行
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "str=%%i"
call set "str=%%str:*:=%%"
call echo "%%str%%"
)
pause

最简洁的:

@echo off
:: 此代码会忽略空行
for /f "delims= eol=" %%i in (test.txt) do echo %%i
pause

  3、在for扩展中,%%~si 表示扩充的路径只含短文件名,但是在以下的测试过程中,却发现真正的情况并非如此:

  测试环境:
--------------------------------------------------------------------------------
D:\abcdefg hijk\abcd efgh.txt
D:\abcdefg hijk\te st.txt

  测试代码:
--------------------------------------------------------------------------------
@echo off
for /f "delims=" %%i in ('dir /a /b *.txt') do echo %%~si
pause

  测试结果:
--------------------------------------------------------------------------------
D:\ABCDEF~1\ABCDEF~1.TXT
D:\ABCDEF~1\TEST~1.TXTtxt

  看到测试结果的最后一条记录了吗?居然扩展到了 TEST~1.TXTtxt !

  总结了一下出错的情形,似乎是这样的:当路径中有超过一个的地方因为目录名超过11个字符而扩充到短文件名的时候,文件名+后缀名
少于11个字符且带空格的文件就会发生扩展错误。

(0)

相关推荐

  • for命令的一些bug分析

    1.关于冒号:当某行内容以 : 打头时,用 for /f "tokens=1* delims=:" %%i in ('findstr /n .* test.txt') do echo.%%j 会把 : 过滤掉: 2.关于分号:findstr .* test.txt 可以把以分号打头的行完整显示出来,但是,用在for语句中就不能找到了,必须加上参数/n才可以 ,似乎是for语句会把以分号打头的行当作注释内容忽略掉,好象不是findstr的错:而不放在for语句中的 type.more和f

  • Redis exists命令bug分析(案例详解)

    目录 1.复现条件版本: 2.源码分析 3.问题解决 本文基于社区版Redis 4.0.8 1.复现条件版本: 社区版Redis 4.0.10以下版本 使用场景:开启读写分离的主从架构或者集群架构(master只负责写流量,slave负责读流量) 案例: # 写入一条带过期时间10s的key 10.90.73.147:12345> set luxiu1 1 ex 10 OK 10.90.73.147:12345> get luxiu1 "1" 10.90.73.147:12

  • 常用的Docker命令及示例汇总分析

    目录 1.容器生命周期管理 (1)docker run (2)start/stop/restart (3)docker kill (4)docker rm (5)pause/unpause (6)create (7)docker exec (8)docker ps (9)docker inspect (10)top 1.容器生命周期管理 (1)docker run 命令说明     创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [

  • 不规范使用ThreadLocal导致bug分析解决

    目录 因为线程重用导致的信息错乱的bug 正确使用的姿势 更优雅的处理方式 最后 因为线程重用导致的信息错乱的bug ThreadLocal一般用于线程间的数据隔离,通过将数据缓存在ThreadLocal中,可以极大的提升性能.但是,如果错误的使用Threadlocal,可能会引起不可预期的bug,以及造成内存泄露. 有时我们会在一个接口中缓存某些数据到ThreadLocal中,但是我们要意识到,处理请求的这些线程是由tomcat提供的,而tomcat提供的线程都是配置在一个线程池中的. 也就是

  • Android笔记之:App调试的几个命令的实践与分析

    在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下. 1.logcat命令这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v time adb logcat -v time 2.bugreport命令这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumps

  • Mysql Explain命令的使用与分析

    mysql explain命令用于显示mysql如何使用索引来处理select语句以及连接表.通过该命令可以分析出查询语句或是表结构的性能瓶颈,从而写出性能更好的SQL语句,通过 expalin 命令我们可以得到: 1. 表的读取顺序 2. 表的读取操作的操作类型 3. 哪些索引可以使用 4. 哪些索引被实际使用 5. 表之间的引用 6. 每张表有多少行被优化器查询 explain 的使用方法,在select语句前加上explain就可以了, 如: explain select * form c

  • shell脚本中case条件控制语句的一个bug分析

    在shell脚本中,发现case语句的一个问题.就是指定小写字母[a-z]和大写字母[A-Z]的这种方法不管用了. 出现如下情况: 复制代码 代码如下: [root@station1 ~]# cat case.sh#!/bin/bashwhile :doecho -n "input a letter: "read varcase "$var" in  [a-z]) echo "Lowercase letter";;  [A-Z]) echo &q

  • asp.NET开发中正则表达式中BUG分析

    比如以下的代码就是用来测试用正则表达式匹配从 0xff 到 0xffff 的字符.而值范围在 0 到 0xfe 的所有字符是不能被匹配的. 以下为引用的内容: 复制代码 代码如下: Regex regex = new Regex(@"[/u00FF-/uFFFF]+"); // The characters, whoes value are smaller than 0xff, // are not expected to be matched. for (int i = 0; i &

  • JS设计模式之命令模式概念与用法分析

    本文实例讲述了JS设计模式之命令模式概念与用法.分享给大家供大家参考,具体如下: 客户创建命令:调用者执行该命令:接收者在命令执行时执行相应操作 简单命令对象一般用来消除二个对象(调用者和接收者)之间的耦合,而复杂的命令对象则一般用来封装不可分的或事务性的指令. 命令模式的主要用途是把调用对象(用户界面.API和代理等)与实现操作的对象隔离开.凡是两个对象间互动方式需要有更高的模块化程度时都可以用到这种模式. 命令的意思是用一个简单方法或函数去执行和这个命令相关的实际操作.就如同用遥控器打开电视

  • PHP中获取变量的变量名的一段代码的bug分析

    复制代码 代码如下: /** * 获取变量名 * * @param $string * @return $string * * $test = "helo"; * $test2 = "helo"; * getVarName($test2); */ function getVarName(&$src){ //存储当前变量值 $save = $src; //存储所有变量值 $allvar = $GLOBALS; //在函数中不要直拉遍历$GLOBALS,会出现堆

随机推荐