使用批处理文件输出/移动时,某些图像文件被删除

使用批处理文件输出/移动时,某些图像文件被删除

一段时间以来,我一直使用批处理文件脚本的各种版本来协助在 WordPress/woocommerce 页面上列出商品,但一直遇到一个问题。该脚本似乎偶尔会随意删除 0 到 2 张图片。

@echo off
setlocal enabledelayedexpansion

set "targetDirectory=C:\Path\to\target\folder"
set "outputDirectory=C:\Path\to\output\folder"

pushd "%targetDirectory%"

for %%F in (*.*) do (
    set "outputFile=!outputDirectory!\%%~nF.webp"
    magick "%%F" "!outputFile!"
)

echo Files in %targetDirectory% have been converted to WebP format and stored in %outputDirectory%.

popd

echo Deleting original files...
del /Q "%targetDirectory%\*.*"

echo Original files in %targetDirectory% have been deleted.

timeout /nobreak /t 3 >nul
endlocal

该脚本只是将一个文件夹中的图像转换为 webp 文件并将其移动到输出文件夹。

我使用 ChatGPT 来生成脚本,因为我对编码了解甚少,但代码看起来相当简单/简短,而且我不明白为什么有时会删除随机图像。

当我检查丢失的输出文件时,它似乎也没有区分不同的原始文件类型。

答案1

该脚本似乎偶尔会不加区别地删除 0 到 2 张图像。

改变你的操作方式,转换所有内容并删除源不会在每个执行/文件的结果控制中进行操作。

但是转换您的文件,然后检查每个源文件是否已将其版本转换为SameFileName.WebP,如果有,则删除该文件,否则,在屏幕上报告错误而不删除源自错误的文件。


@echo off && setlocal enabledelayedexpansion

set "_targetDirectory=C:\Path\to\target\folder"
set "_outputDirectory=C:\Path\to\output\folder"

pushd "%_targetDirectory%" && (
     for %%F in (*.*) do magick "%%~F" "!outputDirectory!\%%~nF.webp"
    ) || exit /b 1

echo/Files in %_targetDirectory% have been converted 
echo/to WebP format and stored in %_outputDirectory%.

for /f usebackq^delims^= %%F in (`
     dir /a:-d /b *.* ^| findstr /veic:.webp
   `) do if exist "!_outputDirectory!\%%~nF.webp" (
         del /Q "%_targetDirectory%\%%~nxF"
        )else echo/ERROR: "!outputDirectory!\%%~nF.webp"

popd & timeout /nobreak /t 3 >nul & endlocal

  1. 将您的文件转换为当前for循环。
  2. 使用第二个for循环再次列出并过滤文件。
  3. 添加一个if来过滤第二个循环的输出并检查新文件是否存在。
  4. 无论是否存在,都针对相关情况采取删除或不删除的操作。

@echo off && setlocal enabledelayedexpansion

set "_targetDir=C:\Path\To\Folder-Input"
set "_outputDir=C:\Path\To\Folder-Output"

set "_OutDir=%_outputDir:\=" & set "_OutDir=%"
set "_cWebP=C:\Program Files\LibWebP\bin\cwebp.exe"

cd /d "%_targetDir%" && =;( for %%F in =;(*.*);= do =;(
     2>&1 "%_cWebP%" -q 100 "%%~F" -o "!_outputDir!\%%~nF.webp" | findstr.exe /bei "ERROR.*.png'"
    );= || echo/.\"%%~nF.webp" ==^> zOk^^!! );= || exit /b 001

echo/Files in %_targetDir% have been converted to WebP format and stored in "..\!_OutDir!".

for /f usebackq^delims^= %%F in =;(` dir /a:-d /b *.* ^| findstr.exe /veic:.webp
   `);= do if exist "!_outputDir!\%%~nF.webp" =;( del /q /f "%_targetDir%\%%~nxF"
        );= else echo/ERROR File: "!_outputDir!\%%~nxF"

timeout.exe /nobreak /t 05 >nul & explorer.exe "!_targetDir!" & endlocal

答案2

无论 magick 是否成功,脚本都会删除所有输入文件;没有错误检查。我猜这就是为什么有些文件没有被转换而只是被删除的原因。

查看脚本的输出可能会确认,如果 magick 给出有关错误的任何反馈,我不确定。


仅供参考,这里是另一个关于向 Windows 批处理文件添加错误检查的问题的链接(在某些方面类似于 bash,我想知道哪个先出现):


只是为了好玩,我试着看看脚本的 bash 版本是什么样子...magick在 indir 的文件上运行,通过删除最后一个句点后的所有内容并添加“webp”来更改文件名,然后删除成功的文件或将失败的文件移至 faildir:

#!/bin/bash
indir="/path/to/input dir"
outdir="/path/to/output dir"
faildir="/path/to/fail dir"

for i in "$indir"/* ; do
magick "$i" "$outdir/$(basename "${i%.*}.webp")" && {
    echo success, removing $i; rm -v "$i"; } || {
    echo "fail on $i, moving to $faildir"; mv "$i" -t "$faildir"; } 
done

批处理文件版本可以类似,它似乎使用相同的&&成功||/失败运算符,可能用常规圆括号代替花括号?

相关内容