当我将一个批处理文件拖放到批处理文件中时,我编写了一个批处理文件来使用PngCrush来优化.png映像。
在下一节中,我写了一些我认为会很好地升级到批处理文件的内容。
我的问题是:是否可以像我在文章中那样创建一个批处理文件,但是能够同时优化多个映像?拖放多个.png文件在上面?(并使输出类似于new.png、新(1).png、新(2).png等.
发布于 2009-08-07 02:33:15
是的,这当然是可能的。当拖动一个批处理文件上的多个文件时,您将得到删除文件的列表,作为空格分隔的列表。您可以使用以下简单的批处理来验证这一点:
@echo %*
@pause
现在您有两个选择:
%*
传递给PngCrush,而不仅仅是%1
(就像您现在可能做的那样):@pngcrush %*
%*
包含批处理文件的所有参数,因此这是将所有参数传递给另一个程序的方便方法。不过,要小心处理像PngCrush选项这样的文件。UNIX极客会知道这个问题:-)
但是,在阅读了描述您的技术的文章之后,这将无法正常工作,因为您正在将压缩文件写入new.png
。如果您同时处理多个文件,这是个坏主意,因为只有一个new.png
:-)。但是我刚刚尝试过PngCrush处理多个文件很好,所以如果您不介意对文件进行就地更新,那么
@pngcrush -reduce -brute %*
进入您的批处理将完成这项工作(遵循原始的article).
shift
:@echo off if %1==[] goto :eof :循环-reduce -brute %1 "%~dpn1_new%~x1“移位如果不是%1==[] goto循环
我们在这里所做的事情很简单:首先,如果没有参数运行,我们跳过整个批处理,然后定义一个要跳转到:loop
的标签。在内部,我们只需对第一个参数运行PngCrush,为压缩文件提供一个新的名称。您可能需要阅读一下我在help call
中使用的路径剖析语法。基本上,我在这里所做的就是像以前一样命名文件;我只是把"_new“放在文件名的末尾(在扩展名之前)。%~dpn1
扩展为驱动器、路径和文件名(没有扩展名),而%~x1
扩展到扩展名,包括点。
ETA: Eep,我刚刚用new.png、new(1).png等阅读了您想要的输出。在本例中,我们不需要任何花哨的路径剖析,但我们还有其他问题需要关注。
最简单的方法可能是在处理第一个文件并在每次处理另一个文件时增加计数器之前,先在0启动一个计数器:
@echo off if %1==[] goto :eof set n=0:%n%==0 ( pngcrush -reduce -brute %1 new.png )否则( pngcrush -reduce -brute %1新^(%n%^).png)移位集/a n+=1如果不是%1==[] goto循环
%n%
是我们的计数器,我们通过将结果写入new.png
而不是new(0).png
来处理n
为0的情况。
不过,这种方法也有问题。如果已经有名为new.png
或new(x).png
的文件,那么您可能会对它们进行重击。不太好。因此,我们必须做一些不同的事情,并检查是否可以实际使用文件名:
new.png的rem检查如果存在new.png (set n=1)或(set n=0 & goto循环)检查编号的新(X).png:校验循环(如果不存在新的^(%n%^).png goto循环集/a n+=1 goto校验循环
程序的其余部分保持不变,包括普通循环。但是现在我们从第一个未使用的文件名开始,避免覆盖已经存在的文件。
随时根据需要进行调整。
发布于 2011-03-20 10:08:51
以安全的方式执行拖放操作,对于批处理来说并不是那么简单。
处理%1
、shift
或%*
可能会失败,因为资源管理器不是很聪明,在引用文件名时,只引用带有空格的文件名。
但是资源管理器没有引用像Cool&stuff.png
这样的文件,所以您可以得到一个cmdline,如
pngCr.bat Cool&stuff.png
因此,在%1
中只有Cool
,即使在%*
中只有Cool
,但是在批处理结束后,cmd.exe尝试执行stuff.png
(并将失败)。
要处理这个问题,您可以使用!cmdcmdline!
而不是%1
来访问参数。%n
,为了在执行结束时绕过潜在的错误,一个简单的exit
可能会有所帮助。
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem Take the cmd-line, remove all until the first parameter
set "params=!cmdcmdline:~0,-1!"
set "params=!params:*" =!"
set count=0
rem Split the parameters on spaces but respect the quotes
for %%G IN (!params!) do (
set /a count+=1
set "item_!count!=%%~G"
rem echo !count! %%~G
)
rem list the parameters
for /L %%n in (1,1,!count!) DO (
echo %%n #!item_%%n!#
)
pause
REM ** The exit is important, so the cmd.ex doesn't try to execute commands after ampersands
exit
顺便说一句。拖放操作的行限制为2048个字符,尽管“标准”批处理行限制为8192个字符。
对于每个文件都传递了完整的路径,很少的文件就可以达到这个限制。
发布于 2014-11-24 20:30:44
FOR %%A IN (%*) DO (
REM Now your batch file handles %%A instead of %1
REM No need to use SHIFT anymore.
ECHO %%A
)
要区分已删除的文件和文件夹,可以使用以下命令:
FOR %%I IN (%*) DO (
ECHO.%%~aI | FIND "d" >NUL
IF ERRORLEVEL 1 (
REM Processing Dropped Files
CALL :_jobF "%%~fI"
) ELSE (
REM Processing Dropped Folders
CALL :_jobD "%%~fI"
)
)
https://stackoverflow.com/questions/1243240
复制