image - 将批处理文件拖放到多个文件中?

标签 image optimization batch-file png

当我将批处理文件拖放到批处理文件上时,我编写了一个批处理文件以使用PngCrush优化.png图像。

在下一部分中,我写了关于我认为对批处理文件的良好升级的书。

我的问题是:是否可以像我在帖子中那样创建批处理文件,但是能够一次优化多个图像?将多个.png文件拖放到上面? (并且输出类似于new.png,new(1).png,new(2).png等)。

最佳答案

是的,当然可以。在批处理文件上拖动多个文件时,您将获得删除文件的列表,并以空格分隔。您可以使用以下简单批处理来验证这一点:

@echo %*
@pause


现在,您有两个选择:


PngCrush已经可以处理在命令行上为其指定的多个文件名。在这种情况下,您要做的就是将%*传递给PngCrush而不是仅仅传递%1(就像您现在所做的那样):

@pngcrush %*


%*包含批处理文件的所有参数,因此这是将所有参数传递到另一个程序的便捷方法。但是,请谨慎处理名为PngCrush选项的文件。 UNIX极客会知道这个问题:-)

但是,在阅读了描述技术的文章后,由于将压缩文件写入new.png,因此无法正常工作。如果一次要处理多个文件,这是一个坏主意,因为只能有一个new.png :-)。但是我只是尝试了PngCrush可以很好地处理多个文件,因此,如果您不介意文件的就地更新,则可以

@pngcrush -reduce -brute %*


放入您的批次即可完成这项工作(按照您的原始文章)。
PngCrush将无法处理多个文件,或者您要在压缩后将每个图像写入一个新文件。在这种情况下,您坚持使用“一次一个文件”的例程,但是会遍历输入参数。在这种情况下,最简单的方法是在每次处理一个循环时构建一个小循环并shift自变量:

@echo off
if [%1]==[] goto :eof
:loop
pngcrush -reduce -brute %1 "%~dpn1_new%~x1"
shift
if not [%1]==[] goto loop


我们在这里做的事情很简单:首先,如果没有参数运行,我们跳过整个批处理,然后定义要跳转到的标签:loop。在内部,我们仅对第一个参数运行PngCrush,为压缩文件重新命名。您可能需要阅读我在help call中使用的路径解剖语法。基本上,我在这里所做的就是完全像以前一样命名文件;我只是将“ _new”粘贴到文件名的末尾(扩展名之前)。 %~dpn1扩展为驱动器,路径和文件名(不带扩展名),而%~x1扩展为扩展名,包括点。

ETA:嗯,我只是用new.png,new(1).png等读取了您想要的输出。在这种情况下,我们不需要花哨的路径剖析,但还有其他问题需要关注。

最简单的方法可能是在处理第一个文件之前在0处启动一个计数器,并在每次处理另一个文件时将其递增:

@echo off
if [%1]==[] goto :eof
set n=0
:loop
if %n%==0 (
    pngcrush -reduce -brute %1 new.png
) else (
    pngcrush -reduce -brute %1 new^(%n%^).png
)
shift
set /a n+=1
if not [%1]==[] goto loop


%n%是这里的计数器,我们通过将结果写入n而不是new.png来处理new(0).png为0的情况。

但是,这种方法存在问题。如果已经有名为new.pngnew(x).png的文件,则可能会破坏它们。不太好。因此,我们必须做一些不同的事情,并检查我们是否可以实际使用文件名:

rem check for new.png
if exist new.png (set n=1) else (set n=0 & goto loop)
rem check for numbered new(x).png
:checkloop
if not exist new^(%n%^).png goto loop
set /a n+=1
goto checkloop


程序的其余部分保持不变,包括正常循环。但是现在我们从第一个未使用的文件名开始,避免覆盖已经存在的文件。


随时根据需要进行调整。

关于image - 将批处理文件拖放到多个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1243240/

相关文章:

javascript - 是否可以获取一次 getImageData 并在特定位置之后提取数据?

android - 代码优化-声明多个方法引用的 View 并实现onclicklistener

ruby - 计算 ruby​​ 中子字符串列表出现次数的最快方法

windows - Windows bat 文件中的 bang 字符是什么意思?

error-handling - 从DOS进行错误测试和控制

Windows 批处理 : "if exist" -- path exists but it says no -- why?

php - 通过 PHP 加载图像

html - 带有本地文件 :///URL is not shown in the Microsoft Edge web browser 的 Img 标签

javascript - 关闭编译器错误: JSC_NOT_A_CONSTRUCTOR

javascript - 将原始图像绘制到 Canvas 中