我需要一个 .bat for /f 循环,它将仅从所有文件夹(+任何子文件夹)中列出指定的文件名 - 例如 20220103_1603-Picture 1.jpg、20100523_0900-Picture_outdoors.png、20110901-Image of tree.gif 等。
我有以下内容,但我想在循环中使用正则表达式
SETLOCAL EnableDelayedExpansion
FOR /R %%F IN ("20??????*-*.*") DO (
<actions>
)
如果有人可以建议如何使用正则表达式来实现这一点,或者使用其他方法来实现相同的结果。
我已经尝试过这个,但它似乎不起作用:
FOR /R %%F IN ("::[0-9]{8}[\_|\-].*\..*") DO (
<actions>
)
答案1
如果您不介意使用 Powershell,您可以使用以下命令对目录查询执行正则表达式过滤。
Get-ChildItem -recurse | Where-Object -property "Name" -Match "::[0-9]{8}[\_|\-].*\..*" {
write-host $_.name
#do more stuff...
}
上面的内容也可以使用别名来编写,以使其更像 CMD 的外观:
dir -recurse | where "Name" -match "::[0-9]{8}[\_|\-].*\..*" {
$_.name
#more stuff
}
根据请求,一种从批处理文件使用 powershell 的方法:也可以将其编写为可以在批处理文件中使用,但在这种情况下,您会受到更多限制。请记住,循环的所有命令都必须在 powershell 中,因此将其编写为批处理文件会不必要地限制您自己。
powershell -command "dir|? name -match ::[0-9]{8}[\_|\-].*\..*{ $_;$command2;$command3}"
或者,您可以在 .ps1 脚本中编写 powershell 并从 .cmd 文件中使用以下命令:
powershell -file "C:\My path\My file.ps1"
与和| ?
相同。| where
| where-object
答案2
使用 for /f 和 dir 命令:
SETLOCAL EnableDelayedExpansion
FOR /f "delims=" %%F IN ('dir /b "20??????*-*.*"') DO (
<actions>
)