在命令行CMD中列出除以特定字符结尾的所有jpg文件

Listing all jpg files except ending with certain character in command line CMD

我想要 echo 所有 *.jpg 个文件,除了 *-.jpg,所以我做了这个命令:

for %i in (*.jpg) do if not "%i"=="*-.jpg" echo %~i

但它失败了,因为它回显了所有 jpg 文件。

为了实验,我写了这个命令:

for %i in (*.jpg) do if not "%i"=="*.jpg" echo %~i

我原以为这个命令不会回显任何文件,但它确实回显了 jpg 文件,尽管有 if not 命令。

我错过了什么?

更新:

我的目标是用以下内容重写我的批处理文件:

for %%i in (*.jpg) do magick "%%i" -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB "%%~ni"-.jpg

以便它进行压缩操作,仅当文件名不以 - 结尾时。

我尝试了这个但没有成功,随后的调查导致了这个问题:

for %%i in (*.jpg) do if not "%%ni"=="*-.jpg" magick "%%i" -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB "%%~ni"-.jpg

运行 到 find.exe 的文件名并省略那些包含 -.jpg 的文件。 /V 开关告诉 find.exe 省略找到字符串的行。使用 findstr.exe 使用正则表达式可以确保它只在文件名的末尾找到。与往常一样,使用 FIND /?FINDSTR /? 阅读所有内容。

DIR /B /A:-D "*.jpg" | "%SystemRoot%\system32\find.exe" /V "-.jpg"
    or
DIR /B /A:-D "*.jpg" | "%SystemRoot%\system32\findstr.exe" /V /R "\-\.jpg$"

如果您想升级到现代语言,使用 PowerShell 很容易。

Get-ChildItem -File -Filter '*.jpg' | Where-Object { $_.Name -notmatch '\-\.jpg$' }

更新问题,更新答案

magick 命令行如您所愿出现时,删除该行开头的 ECHO

SET "EXT=jpg"
FOR /F "delims=" %%A IN ('DIR /B /A:-D "*.%EXT%" ^| "%SystemRoot%\system32\findstr.exe" /V /R "\-\.%EXT%$"') DO (
    ECHO magick "%%~A" -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB "%%~nA-.%EXT%"
)

在 PowerShell 中

Get-ChildItem -File -Filter '*.jpg' |
    Where-Object { $_.Name -notmatch '\-\.jpg$' } |
    ForEach-Object {
        & magick "$_.FullName" -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB ("$_.BaseName" + "-.jpg")
    }

这是最终的批处理文件: FOR /F "usebackq delims=" %%i in (`DIR /B /A:-D "*.jpg" ^| find /V "-.jpg"`) DO magick "%%i" -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB "%%~ni"-.jpg

供参考: https://renenyffenegger.ch/notes/Windows/dirs/Windows/System32/cmd_exe/commands/for/f/command/index https://ss64.com/nt/for.html