我有多个与&&
加入的命令。它看起来与此相似:
(do something1) &&
(for /f "delims=" %f in ('dir /b /a-d ^| findstr /vile "jpg"') do del "%f") &&
(do something2) &&
第二行应删除除jpg之外的所有文件。当我在目录中确实有其他文件时,它工作正常:
C:\Test
|-- foo.jpg
|-- bar.jpg
|-- baz.png
但是当我没有其他任何文件时,do something2
将无法启动:
C:\Test
|-- foo.jpg
|-- bar.jpg
Since there are no other files except jpg, `do something2` will not be started.
有没有办法解决问题,而不会将&&
更改为&
?
(据我所知,作为第一步,应该检查非jpg文件的存在。但我还没有找到如何实现它。)
修改
正如评论中所建议的,这里是完整的代码:
(if not exist normal mkdir normal) &&
(if not exist small mkdir small) &&
(if exist *.jpg copy *.jpg normal >nul) &&
(for /f "delims=" %f in ('dir /b /a-d ^| findstr /ile "png jpg jpeg gif" ^| findstr /vile "jpg"') do convert "%f" -set filename:f "%t.%e" "normal\%[filename:f].jpg") &&
cd normal &&
mogrify -thumbnail 100x100^> -path ..\small *
此代码将使用ImageMagick实用程序将任何图像(png,gif)转换为jpg格式,并为每个图像创建小的预览缩略图。
文件名冲突,例如:
cat.png -> cat.jpg
cat.jpg -> cat.jpg
已经解决了。
答案 0 :(得分:1)
为什么不在FOR循环后将&&
更改为&
,以便something2
无论ERRORLEVEL
如何都会运行?
(do something1) &&
(for /f "delims=" %f in ('dir /b /a-d ^| findstr /vile "jpg"') do del "%f") &
(do something2) &&
编辑我不确定我是否完全理解您对此很难的评论。您似乎希望在所有.png,.jpeg和.gif文件上运行convert
,而不是在.jpg文件上运行||
。这是对的吗?
仅当ERRORLEVEL不为零(0)时,使用if not exist normal (mkdir normal) || GOTO Failure
if not exist small (mkdir small) || GOTO Failure
if exist *.jpg (copy *.jpg normal >nul) || GOTO Failure
for /f "delims=" %%f in ('dir /b /a-d *.png *.jpeg *.gif') do (
convert "%f" -set filename:f "%t.%e" "normal\%[filename:f].jpg"
IF ERRORLEVEL 1 (GOTO Failure)
)
cd normal || GOTO Failure
mogrify -thumbnail 100x100^> -path ..\small *
:Failure
EXIT /B %ERRORLEVEL%
才会执行下一个语句。
span