【发布时间】: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