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

回复 8# 77七


    可以先用 findstr 确定全部由[a-f0-9]组成,再用字符偏移定位其长度,这样用1个findstr即可。
findstr 正则不支持表示范围的量词,只能选择折中方案。
举例:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.bin ^| findstr /i "^[0-9a-f][0-9a-f]*\.bin$"') do (
  4.     set "name=%%~ni"
  5.     if "!name:~32!" == "" (
  6.         if "!name:~31!" NEQ "" echo;%%i
  7.     )
  8. )
  9. pause
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

通过 findstr 管道套管道,能够解决4楼提出的具体问题,但并不通用,源于 findstr 不支持{m,n}这种表示范围的量词。

比如条件变一下:查找大于等于16个字符,小于等于32个字符,全部由[a-f0-9]组成的 .bin 文件。
这个时候如果仅仅用 findstr 来解,即使真能够实现,相信也是异常麻烦。
可以采用这种办法:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.bin ^| findstr /i "^[0-9a-f][0-9a-f]*\.bin$"') do (
  4.     set "name=%%~ni"
  5.     if "!name:~32!" == "" (
  6.         if "!name:~15!" NEQ "" echo;%%i
  7.     )
  8. )
  9. pause
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

基于21楼的补充
1.查找大于等于32个字符、全部由[0-9a-f]组成、包括子目录里面的 .bin 文件:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d /s *.bin ^| findstr /i "\\[0-9a-f][0-9a-f]*\.bin$"') do (
  4.     set "name=%%~ni"
  5.     if "!name:~31!" NEQ "" echo;%%i
  6. )
  7. pause
复制代码
2.查找小于等于32个字符、全部由[0-9a-f]组成、包括子目录里面的 .bin 文件:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d /s *.bin ^| findstr /i "\\[0-9a-f][0-9a-f]*\.bin$"') do (
  4.     set "name=%%~ni"
  5.     if "!name:~32!" == "" echo;%%i
  6. )
  7. pause
复制代码
题外话:
网上看到过很多判断文件名长度的提问与回答,其中bat的回答基本上都是先计算字符串长度,再与给定数值进行比较。
其实没有必要,判断字符串长度与计算字符串长度不是一码事。
判断是事先给你一个已知数值,而计算肯定不会给你数值的。这是其一;
其二,CMD没有字符串长度计算的内部或外部命令,我认为即便是高效的二分法也不会比字符偏移法来的方便、直接。

TOP

返回列表