返回列表 发帖

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

??匹配的数量是 1 和 2
dir /b /a-d *_??.pdfCOPY
powershell 中 ?? 匹配数量是 2
Get-ChildItem *_??.txtCOPY
为什么 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个。


@echo off
>123.txt cd.
dir /b /a-d ????.txt
echo=
dir /b /a-d ??3.txt
echo=
dir /b /a-d ??3?.txt
pauseCOPY


三个dir 命令全部匹配成功

另外发现问号"?"对点号 "."匹配失败
@echo off
>12.3.txt cd.
dir /b /a-d ???3.txt
echo=
dir /b /a-d ??.3.txt
pauseCOPY
bat小白,请多指教!谢谢!

TOP

回复 4# hnfeng


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

TOP

回复 8# 77七


    不知道为什么,不成功。
C:\temp\2.8Bin>dir /s /b /a-d
C:\temp\2.8Bin\ShaderCache\0\00a356bb4dcffadfbecc027ff2f0f3f5.bin
C:\temp\2.8Bin\ShaderCache\0\00abace58a961221e6c54cc17e90d1c3.bin
C:\temp\2.8Bin\ShaderCache\0\00afde0f28ad42f7e08ce48672c2d6a8.bin
C:\temp\2.8Bin\ShaderCache\a\a00e46701b2ebba310eb944fb78268a2.bin
C:\temp\2.8Bin\ShaderCache\a\a0a2d4feb4186b3994675cb5cb6105c6.bin
C:\temp\2.8Bin\ShaderCache\a\a0a67596c850febb29bde5f1c15e1839.bin
C:\temp\2.8Bin\test\acddffdg hgfjhjjkjkj.bin
C:\temp\2.8Bin\test\dfdgfdg hjhjkjk.bin
C:\temp\2.8Bin\test\ffffffffff abcd.bin
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"................................\.bin" |findstr /rixc:"[0-9a-z][0-9a-z]*\.bin"
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"................................\.bin"
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"[0-9a-f][0-9a-f]*\.bin"
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"[0-9a-f]*\.bin"
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"[0-9a-f]*"
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:"f.*"
C:\temp\2.8Bin>dir /s /b /a-d |findstr /rixc:".*\.bin"
C:\temp\2.8Bin\ShaderCache\0\00a356bb4dcffadfbecc027ff2f0f3f5.bin
C:\temp\2.8Bin\ShaderCache\0\00abace58a961221e6c54cc17e90d1c3.bin
C:\temp\2.8Bin\ShaderCache\0\00afde0f28ad42f7e08ce48672c2d6a8.bin
C:\temp\2.8Bin\ShaderCache\a\a00e46701b2ebba310eb944fb78268a2.bin
C:\temp\2.8Bin\ShaderCache\a\a0a2d4feb4186b3994675cb5cb6105c6.bin
C:\temp\2.8Bin\ShaderCache\a\a0a67596c850febb29bde5f1c15e1839.bin
C:\temp\2.8Bin\test\acddffdg hgfjhjjkjkj.bin
C:\temp\2.8Bin\test\dfdgfdg hjhjkjk.bin
C:\temp\2.8Bin\test\ffffffffff abcd.bin
C:\temp\2.8Bin>COPY

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 精确匹配,所以出错。改成这样试试:
dir /s /b /a-d |findstr /r /i /c:"\\................................\.bin" | findstr /e /r /i /c:"\\[0-9a-f][0-9a-f]*\.bin"COPY
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或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

返回列表