Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >拖放多个文件的批处理文件?

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

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

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

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-07 02: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 10: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-24 20: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

复制
相关文章
Groovy 添加带注释的Map构造函数
从Groovy的早期开始,我们可以创建POGO(Plain Old Groovy Objects)类,它们将具有带有Map参数的构造函数。 Groovy在生成的类中自动添加构造函数。我们可以使用命名参数来创建POGO的实例,因为Map参数构造函数。 这只有在我们不添加自己的构造函数且属性不是最终的时才有效。从Groovy 2.5.0开始,我们可以使用@MapConstrutor AST转换注释来添加带有Map参数的构造函数。使用注释我们可以有更多选项来自定义生成的构造函数。例如,我们可以让Groovy使用Map参数生成构造函数,并添加我们自己的构造函数。 属性也可以是final,我们仍然可以使用带有Map参数的构造函数。
白石
2019/08/23
1.1K0
Java里的构造函数(构造方法)
本文转载之https://www.cnblogs.com/livterjava/p/4709561.html
用户7886150
2021/01/31
2.5K0
@Autowired的使用:推荐对构造函数进行注释
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
java架构师
2019/06/13
2K0
JAVA & .NET创建对象构造函数调用顺序
基类静态初始化块——当前类静态初始化块——基类初始化块——基类构造函数——当前类初始化块——当前类构造函数
雪飞鸿
2019/03/08
1.1K0
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.5K0
java scanner构造函数_使用Scanner作为构造函数的参数的Java
这是一个学校任务的问题,这就是为什么我这样做的原因。使用Scanner作为构造函数的参数的Java
用户7886150
2021/04/26
2.8K0
Java 构造函数的详解
我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢?
全栈程序员站长
2022/09/08
5610
[ Java学习基础 ] Java构造函数
   构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用。 Java构造方法的特点如下: 构造方法名必须与类名相同。 构造方法没有任何返回值,包括void。 构造方法只能与new运算符结合使用。 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int wi
Kevin_Zhang
2018/05/22
1.3K0
通过工厂函数、构造函数创建对象
当我们有多个变量的结构非常类似时,如下所示,反复书写结构过于麻烦,我们可以定义一个工厂函数来创建对象
很酷的站长
2022/12/21
7890
通过工厂函数、构造函数创建对象
什么是java构造函数_什么是java构造函数
构造函数是面向对象中的一员,构造函数可以叫做构造器,它的函数名与类名相同,不用定义返回值类型,也没有具体的返回值。构造函数是在构建创造时对象时调用函数,作用是可以给对象进行初始化,创建对象都必须要通过构造函数初始化。一个类中如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么该类中的默认构造函数就没有了。
全栈程序员站长
2022/09/08
1.2K0
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.5K0
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ;
韩曙亮
2023/03/27
4.1K0
Groovy 元组构造函数创建
Groovy 1.8添加了@TupleConstructor注释。 通过这个注释,我们可以在编译时自动创建一个元组构造函数。 因此构造函数可以在编译的类中找到。 对于类中的每个属性,将使用默认值创建构造函数中的参数。 类中定义的属性的顺序还定义了构造函数中参数的顺序。 因为参数具有默认值,所以我们可以使用Groovy语法,并在使用构造函数时将参数留在参数列表的末尾。
白石
2019/09/18
1.3K0
@Autowired的使用--Spring规范解释,推荐对构造函数进行注释
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies.
ydymz
2018/09/10
4.2K0
Java复制构造函数
----------------------------------------------------------------------------------
用户7886150
2020/12/15
9610
java构造函数方法声明无效_如何构造函数
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值。
全栈程序员站长
2022/10/05
1.7K0
C++核心准则C.51:使用委托构造函数实现所有构造函数的共通动作
C.51: Use delegating constructors to represent common actions for all constructors of a class C.51:使用委托构造函数实现所有构造函数的共通动作
面向对象思考
2020/03/25
6890
【说站】js创建构造函数的注意点
推荐操作环境:windows7系统、jquery3.2.1版本,DELL G3电脑。
很酷的站长
2022/11/24
7230
【说站】js创建构造函数的注意点
LeetCode - 所有可能的路径
我又重新开始更新LeetCode了,以后工作日更新LeetCode,周末更新东野圭吾的小说
晓痴
2019/07/24
7490
LeetCode - 所有可能的路径
java构造代码块,构造函数和普通函数的区别和调用时间
在这里我们谈论一下构造代码块,构造函数和普通函数的区别和调用时间。 构造代码块:最早运行,比构造函数运行的时间好要提前,和构造函数一样,只在对象初始化的时候运行。 构造函数:运行时间比构造代码块时间晚,也是在对象初始化的时候运行。没有返回值,构造函数名称和类名一致。 普通函数:不能自动调用,需要对象来调用,例如a.add(); 如果只看代码运行先后顺序的话:构造代码块>构造函数>普通函数 下面给一个程序
用户3030674
2018/09/14
1.5K0
java构造代码块,构造函数和普通函数的区别和调用时间

相似问题

UIKeyboardWillChangeFrameNotification并非总是被调用

152

CallListener onCallProgressing()并非总是被调用

10

Viewpager Fragment 1 onCreateView并非总是被调用

19

从NSSharingService扩展调用FinderSync

14

并非总是调用NSMenuItem自定义视图drawRect

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档