【问题标题】:Listing all jpg files except ending with certain character in command line CMD列出所有 jpg 文件,除了在命令行 CMD 中以特定字符结尾
【发布时间】:2021-07-23 22:10:48
【问题描述】:

我想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

【问题讨论】:

  • 如果不是呢?显然,没有文件将以 *.jpg 作为名称,也就是说,在 cmd 命令行(也不是批处理文件)中,* not 匹配多个字符,除了作为几个命令的参数!改用:cmd /V /C for %i in (*.jpg) do @(set "name=%i" ^& if "!name:~-5!" neq "-.jpg" echo %i)...在批处理文件中更简单!
  • if 没有像* 或? 这样的通配符(if exist 除外)...
  • 最好告诉我们你的真正意图是什么,因为将文件名打印到控制台并不真正构成一项有用的任务。例如,如果您要复制或移动它们,您可以使用 robocopy 及其 /xf 选项和 *-.jpg,例如robocopy . destination *.jpg /xf *-.jpg >nul。你甚至可以用它来列出它们,例如robocopy . ~ *.jpg /l /nc /ndl /njh /njs /np /ns /xf *-.jpg 或仅包含文件名的for-loop:for /f %i in ('robocopy . ~ *.jpg /l /nc /ndl /njh /njs /np /ns /xf *-.jpg') do @echo %~nxi。
  • @Compo,我更新了我的帖子
  • @aschipfl 这解释了为什么它不起作用。至少我知道。

标签: windows for-loop batch-file cmd imagemagick


【解决方案1】:

通过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")
    }

【讨论】:

  • 如何在 DIR /B /A:-D "*.jpg" | find /V "-.jpg" 上创建一个 for 循环?我可以吗?
  • @AndrewAnderson,为什么需要FOR 循环?您是否尝试过运行这些命令行之一?这在哪些方面没有按您的预期工作?
  • @AndrewAnderson,我看到你已经改变了问题。
  • 这应该可以,但它不行:FOR /F "usebackq tokens=*" %%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。我使用了这个问题的答案:superuser.com/questions/983510/exclude-a-file-name-in-for-loop
  • @AndrewAnderson,说“.should 工作,但它没有”并没有给任何人任何继续。您未能使用 CIRCUMFLEX ACCENT 避开 VERTICAL LINE。
【解决方案2】:

这是最终的批处理文件: 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多