在命令行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
我想要 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