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

[文件操作] 批处理命令dir 中 ? 的匹配问题

??匹配的数量是 1 和 2
  1. dir /b /a-d *_??.pdf
复制代码
powershell 中 ?? 匹配数量是 2
  1. Get-ChildItem *_??.txt
复制代码
为什么 cmd 中是这样?

额,powershell中的问号(?)匹配一个字符,大概是powershell自己的规则
如果想要像cmd那样,试试用-Filter选项
Get-ChildItem -Filter *_??.txt

TOP

?匹配0个、1个,??匹配0个、1个、2个
bat小白,请多指教!谢谢!

TOP

本帖最后由 hnfeng 于 2024-2-2 11:03 编辑

那么,在cmd中,如何仅匹配:
0fca724925a0312d9261912bfe810eaa.bin
0fcbc1c2d20b8724f538718827a97d85.bin
0fe920300e68d25db45c915c0c755d73.bin
0ff4803731ace688f5ec1333ff40d569.bin
(32个 由0-9和a-f组成的字符串).bin

又不会误伤 正常的少于32个字符的普通 .bin 文件?

TOP

回复 3# 77七
cmd还是有点奇葩,dir时,如果问号在前面看看会发生什么。
比如有这样一些文件:
abc123.txt
bc123.txt
c123.txt
123.txt
分别执行dir命令:
dir /b /a-d ???123.txt
dir /b /a-d ??123.txt
dir /b /a-d ?123.txt
结果是什么?
1

评分人数

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

TOP

回复 2# Five66


恰恰相反,正经的通配符:
? 匹配1个字符
* 匹配0个或1个或任意多个字符

反而是CMD自己的规则不符大多数软件和人的共识
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 77七 于 2024-2-2 13:49 编辑

回复 5# qixiaobin0715


   
谢谢大佬指点!
经过测试发现,当一个?或者连续多个?出现在开头,且点号之前不全是?(出现其它字符),其它字符之前的?只匹配1个,其它字符之后的?匹配0个,1个。


  1. @echo off
  2. >123.txt cd.
  3. dir /b /a-d ????.txt
  4. echo=
  5. dir /b /a-d ??3.txt
  6. echo=
  7. dir /b /a-d ??3?.txt
  8. pause
复制代码


三个dir 命令全部匹配成功

另外发现问号"?"对点号 "."匹配失败
  1. @echo off
  2. >12.3.txt cd.
  3. dir /b /a-d ???3.txt
  4. echo=
  5. dir /b /a-d ??.3.txt
  6. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 4# hnfeng


发现32个[0-9a-z]提示过长,所以用了两个findstr匹配
  1. dir /b /a-d |findstr /rixc:"................................\.bin" |findstr /rixc:"[0-9a-z][0-9a-z]*\.bin"
复制代码
bat小白,请多指教!谢谢!

TOP

回复 8# 77七


    不知道为什么,不成功。
  1. C:\temp\2.8Bin>dir /s /b /a-d
  2. C:\temp\2.8Bin\ShaderCache\0\00a356bb4dcffadfbecc027ff2f0f3f5.bin
  3. C:\temp\2.8Bin\ShaderCache\0\00abace58a961221e6c54cc17e90d1c3.bin
  4. C:\temp\2.8Bin\ShaderCache\0\00afde0f28ad42f7e08ce48672c2d6a8.bin
  5. C:\temp\2.8Bin\ShaderCache\a\a00e46701b2ebba310eb944fb78268a2.bin
  6. C:\temp\2.8Bin\ShaderCache\a\a0a2d4feb4186b3994675cb5cb6105c6.bin
  7. C:\temp\2.8Bin\ShaderCache\a\a0a67596c850febb29bde5f1c15e1839.bin
  8. C:\temp\2.8Bin\test\acddffdg hgfjhjjkjkj.bin
  9. C:\temp\2.8Bin\test\dfdgfdg hjhjkjk.bin
  10. C:\temp\2.8Bin\test\ffffffffff abcd.bin
  11. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"................................\.bin" |findstr /rixc:"[0-9a-z][0-9a-z]*\.bin"
  12. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"................................\.bin"
  13. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"[0-9a-f][0-9a-f]*\.bin"
  14. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"[0-9a-f]*\.bin"
  15. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"[0-9a-f]*"
  16. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"f.*"
  17. C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:".*\.bin"
  18. C:\temp\2.8Bin\ShaderCache\0\00a356bb4dcffadfbecc027ff2f0f3f5.bin
  19. C:\temp\2.8Bin\ShaderCache\0\00abace58a961221e6c54cc17e90d1c3.bin
  20. C:\temp\2.8Bin\ShaderCache\0\00afde0f28ad42f7e08ce48672c2d6a8.bin
  21. C:\temp\2.8Bin\ShaderCache\a\a00e46701b2ebba310eb944fb78268a2.bin
  22. C:\temp\2.8Bin\ShaderCache\a\a0a2d4feb4186b3994675cb5cb6105c6.bin
  23. C:\temp\2.8Bin\ShaderCache\a\a0a67596c850febb29bde5f1c15e1839.bin
  24. C:\temp\2.8Bin\test\acddffdg hgfjhjjkjkj.bin
  25. C:\temp\2.8Bin\test\dfdgfdg hjhjkjk.bin
  26. C:\temp\2.8Bin\test\ffffffffff abcd.bin
  27. C:\temp\2.8Bin>
复制代码

TOP

dos 从开始,就有缺陷。
首先,抄 unix 的路径分隔符就行,非要反过来。
第二,换行符
第三,获取命令返回值

有谁比较了解这些历史,为什么 dos 不能按照 unix 的习惯。

TOP

回复 6# Batcher


    正则中的 ? 不是匹配 0 个或 1个吗?

TOP

回复 11# _avatar_


    6楼说的是通配符,不是正则表达式。二者的区别你可以搜索一下。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9# hnfeng


你加了 /s 之后文件名前面增加了路径名,但是你的 findstr 命令使用了 /x 精确匹配,所以出错。改成这样试试:
  1. dir /s /b /a-d |findstr /r /i /c:"\\................................\.bin" | findstr /e /r /i /c:"\\[0-9a-f][0-9a-f]*\.bin"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# Batcher


    谢谢,可以了
我原以为只要含有引号内所定义的字符就算匹配成功
另外,请教 "\\[0-9a-f][0-9a-f]*\.bin" 是不是与 "\\[0-9a-f]*\.bin" 相同效果?

TOP

回复 12# Batcher


    是我理解有误,我一直以为cmd中的通配符跟 正则中的量词是一样的。

TOP

返回列表