bat 脚本 'for /F' 循环过滤结果

bat 脚本 'for /F' 循环过滤结果

我需要一个 .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

也可以看看Powershell:使用正则表达式的多种方法

答案2

使用 for /f 和 dir 命令:

SETLOCAL EnableDelayedExpansion
FOR /f "delims=" %%F IN ('dir /b "20??????*-*.*"') DO (
<actions>
)

相关内容