检查目录是否包含除指定的任何文件

时间:2018-02-15 17:43:40

标签: batch-file cmd

我有多个与&&加入的命令。它看起来与此相似:

(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

已经解决了。

1 个答案:

答案 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