标题: [文本处理] findstr无法正确判断/检测/识别/区分大小写字母,出现错误/误判 [打印本页]
作者: xiaogaga663 时间: 2014-6-21 20:52 标题: findstr无法正确判断/检测/识别/区分大小写字母,出现错误/误判
本帖最后由 pcl_test 于 2017-4-13 09:18 编辑
莫非是批处理命令findstr的BUG
是这样的- @echo off & setlocal enabledelayedexpansion
- if exist nu.txt del nu.txt
- set /p a=
- echo !a!>nu.txt
- findstr "[a-z]" nu.txt >nul & if !errorlevel!==0 (echo 小写)
- findstr "[A-Z]" nu.txt >nul & if !errorlevel!==0 (echo 大写)
- del nu.txt
- endlocal
- pause
复制代码
为什么我输入 单个小写字母或大写字母时可正常运作 (如输入a 显示小写)
而输入多个如abcd时,判断就不起作用了呢?(如输入as显示 小写 大写)
还有为何if errorlevel=1可以作为判断依据而if errorlevel=0无判断效果?
高手速来!
作者: Batcher 时间: 2014-6-21 21:52
http://bbs.bathome.net/thread-6851-1-1.html
http://bbs.bathome.net/thread-12314-1-1.html
作者: 522235677 时间: 2014-6-21 23:45
- @echo off & setlocal enabledelayedexpansion
- if exist nu.txt del nu.txt
- set /p a=
- echo !a!>nu.txt
- findstr "[a-z]" nu.txt >nul && echo 小写
- findstr "[A-Z]" nu.txt >nul && echo 大写
- del nu.txt
- endlocal
- pause
复制代码
为毛不这样写
作者: techon 时间: 2014-9-11 02:11
本帖最后由 techon 于 2014-9-13 17:32 编辑
findstr 在文件中查找字符,不管是否找到字符,都不会将 %errorlevel% 置为 1
%errorlevel% 只是在命令出错时被置位, 如找不到 “nu.txt” 的情况下
这个说法不对,忘记变量延迟的问题了- echo ABCDEF|findstr "a" & echo....err=%errorlevel%
- echo....ERR=%errorlevel%
复制代码
作者: HAT 时间: 2014-9-11 08:22
回复 4# techon
把你的测试结果发出来看看?
c:\>echo HAT | findstr "H"
HAT
c:\>echo %errorlevel%
0
c:\>echo HAT | findstr "h"
c:\>echo %errorlevel%
1
c:\>findstr "H" a.txt
HAT
c:\>echo %errorlevel%
0
c:\>findstr "h" a.txt
c:\>echo %errorlevel%
1
作者: techon 时间: 2014-9-13 17:32
不好意思,当时忘了考虑变量延迟问题
看来是字符排序问题,
默认排序是 a A b B c C …… x X y Y z Z
所以:- @echo off
- echo.&echo ----未开变量延迟----
-
- echo.............................
- echo ab|findstr "[A-z]" && echo....[A-z]中包含a或b
- echo Z|findstr "[a-z]" || echo....[a-z]中不包含Z
- echo a|findstr "[A-Z]" || echo....[A-Z]中不包含a
- echo Z|findstr "[A-Z]" && echo....[A-Z]中包含Z
- echo.............................
-
- echo ABCDEF|findstr "a" & echo....err=%errorlevel%
- echo.11111.err=%errorlevel%
- echo.------------------
- echo ABCDEF|findstr "A" & echo.---ERR=%errorlevel%
- echo.22222.err=%errorlevel%
-
- pause
- setlocal enabledelayedexpansion
- echo.&echo //////开启变量延迟\\\\\\
- echo.==========================
-
- echo ABCDEF|findstr "a" & echo....err=!errorlevel!
- echo.11111.err=!errorlevel!
- echo.------------------
- echo ABCDEF|findstr "A" & echo.---ERR=!errorlevel!
- echo.22222.err=!errorlevel!
-
- pause&goto :eof
复制代码
作者: CrLf 时间: 2014-9-13 17:56
回复 6# techon
以前我问过这个问题...http://bbs.bathome.net/viewthread.php?tid=14681
然后大伙众口一词把我K了一顿,才知道这个顺序的依据是语言与区域设置,一改区域设置这个顺序就变了,有兴趣可以去旧帖膜拜寒夜与demon二位大牛:
http://bathome.net/viewthread.php?tid=12329
http://bbs.bathome.net/viewthread.php?tid=18542
http://bbs.bathome.net/viewthread.php?tid=18493
作者: neorobin 时间: 2014-9-13 19:28
回复 7# CrLf
在有些可以找到的源代码中可以看到如下
cbatch.c 时间戳 1997-8-27- /*** eGenCmp - execute an if statement comparison - general case
- *
- * Purpose:
- * Return a nonzero value if comparison condition is met.
- * Otherwise return 0. This routine is never called unless
- * command extensions are enabled.
- *
- * int eStrCmp(struct cmdnode *n)
- *
- * Args:
- * n - the parse tree node containing the string comparison command
- *
- * Returns:
- * See above.
- *
- */
-
- int eGenCmp(n)
- struct cmdnode *n ;
- {
- TCHAR *s1, *s2;
- LONG n1, n2, iCompare;
-
- n1 = _tcstol(n->cmdline, &s1, 0);
- n2 = _tcstol(n->argptr, &s2, 0);
- if (*s1 == NULLC && *s2 == NULLC)
- iCompare = n1 - n2;
- else
- if (n->flag & CMDNODE_FLAG_IF_IGNCASE)
- iCompare = _tcsicmp(n->cmdline, n->argptr);
- else
- iCompare = _tcscmp(n->cmdline, n->argptr);
-
- switch (n->cmdarg) {
- case CMDNODE_ARG_IF_EQU:
- return iCompare == 0;
-
- case CMDNODE_ARG_IF_NEQ:
- return iCompare != 0;
-
- case CMDNODE_ARG_IF_LSS:
- return iCompare < 0;
-
- case CMDNODE_ARG_IF_LEQ:
- return iCompare <= 0;
-
- case CMDNODE_ARG_IF_GTR:
- return iCompare > 0;
-
- case CMDNODE_ARG_IF_GEQ:
- return iCompare >= 0;
- }
-
- return 0;
- }
复制代码
而对于 _tcscmp 和 _tcsicmp (前者分大小写, 后者忽略) 这两个函数
在 tchar.h 中有定义
http://research.microsoft.com/en ... include/tchar.h.htm
截取如下, 根据是否 UNICODE, 是 单字节字符集 还是 多字节字符集等判断, 出现三个实现分支.- #ifdef _UNICODE
- /* ++++++++++++++++++++ UNICODE ++++++++++++++++++++ */
- #define _tcscmp wcscmp
- #define _tcsicmp _wcsicmp
- #else /* _UNICODE */
- /* ++++++++++++++++++++ SBCS and MBCS ++++++++++++++++++++ */
- #ifdef _MBCS
- /* ++++++++++++++++++++ MBCS ++++++++++++++++++++ */
- #ifdef _MB_MAP_DIRECT
- /* use mb functions directly - types must match */
- #define _tcscmp _mbscmp
- #define _tcsicmp _mbsicmp
- #else /* _MB_MAP_DIRECT */
-
- #endif /* _MB_MAP_DIRECT */
- #else /* !_MBCS */
- /* ++++++++++++++++++++ SBCS ++++++++++++++++++++ */
- #define _tcscmp strcmp
- #define _tcsicmp _stricmp
- #endif /* _MBCS */
- #endif /* _UNICODE */
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |