发布
社区首页 >问答首页 >拖放多个文件的批处理文件?

拖放多个文件的批处理文件?
EN

Stack Overflow用户
提问于 2009-08-07 06:37:00
回答 5查看 34.2K关注 0票数 31

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

在下一节中,我写了一些我认为会很好地升级到批处理文件的内容。

我的问题是:是否可以像我在文章中那样创建一个批处理文件,但是能够同时优化多个映像?拖放多个.png文件在上面?(并使输出类似于new.png、新(1).png、新(2).png等.

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-07 10:33:15

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

代码语言:javascript
代码运行次数:0
复制
@echo %*
@pause

现在您有两个选择:

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

@pngcrush %*

%*包含批处理文件的所有参数,因此这是将所有参数传递给另一个程序的方便方法。不过,要小心处理像PngCrush选项这样的文件。UNIX极客会知道这个问题:-)

但是,在阅读了描述您的技术的文章之后,这将无法正常工作,因为您正在将压缩文件写入new.png。如果您同时处理多个文件,这是个坏主意,因为只有一个new.png :-)。但是我刚刚尝试过PngCrush处理多个文件很好,所以如果您不介意对文件进行就地更新,那么

@pngcrush -reduce -brute %*

进入您的批处理将完成这项工作(遵循原始的article).

  • PngCrush将不会处理多个文件,或者您希望在压缩后将每个图像写入一个新文件。在本例中,您坚持使用“一次一个文件”的例程,但循环处理输入参数。在本例中,最简单的方法是在每次处理一个参数时构建一个小循环并对参数进行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.pngnew(x).png的文件,那么您可能会对它们进行重击。不太好。因此,我们必须做一些不同的事情,并检查是否可以实际使用文件名:

new.png的rem检查如果存在new.png (set n=1)或(set n=0 & goto循环)检查编号的新(X).png:校验循环(如果不存在新的^(%n%^).png goto循环集/a n+=1 goto校验循环

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

随时根据需要进行调整。

票数 48
EN

Stack Overflow用户

发布于 2011-03-20 18:08:51

以安全的方式执行拖放操作,对于批处理来说并不是那么简单。

处理%1shift%*可能会失败,因为资源管理器不是很聪明,在引用文件名时,只引用带有空格的文件名。

但是资源管理器没有引用像Cool&stuff.png这样的文件,所以您可以得到一个cmdline,如

代码语言:javascript
代码运行次数:0
复制
pngCr.bat Cool&stuff.png

因此,在%1中只有Cool,即使在%*中只有Cool,但是在批处理结束后,cmd.exe尝试执行stuff.png (并将失败)。

要处理这个问题,您可以使用!cmdcmdline!而不是%1来访问参数。%n,为了在执行结束时绕过潜在的错误,一个简单的exit可能会有所帮助。

代码语言:javascript
代码运行次数:0
复制
@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个字符。

对于每个文件都传递了完整的路径,很少的文件就可以达到这个限制。

票数 14
EN

Stack Overflow用户

发布于 2014-11-25 04:30:44

代码语言:javascript
代码运行次数:0
复制
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

要区分已删除的文件和文件夹,可以使用以下命令:

代码语言:javascript
代码运行次数:0
复制
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"
    )
)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1243240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档