【问题标题】:Drag and drop batch file for multiple files?拖放多个文件的批处理文件?
【发布时间】:2011-07-08 06:54:21
【问题描述】:

我希望用 pcutmp3 完成类似于下面的事情:

Drag and drop batch file for multiple files?

我很难理解 Joey 所做的添加,因为我通常不这样做,但我想将多个文件 (.cue) 放在一个批处理文件上并让它运行不止一次,这批处理文件中的以下行发生了什么:

@echo off
title pcutmp3
cd /d "F:\pcutmp3"
java -jar pcutmp3.jar --cue %1 --dir "F:\Test"
pause
exit

我尝试修改 Joey 的代码...但无济于事(我不知道自己在做什么)

提前感谢您的帮助!

【问题讨论】:

    标签: batch-file


    【解决方案1】:
    @echo off
    title pcutmp3
    cd /d "F:\pcutmp3"
    
    :again
    if "%~1" == "" goto done
    
    java -jar pcutmp3.jar --cue "%~1" --dir "F:\Test"
    
    shift
    goto again
    
    :done
    pause
    exit
    

    这是您的基本“吃掉所有参数”循环。重要的部分是 shift 关键字,它吃掉了%1,并将所有参数向下移动了一个(这样%2 变成了%1%3 变成了%2,等等)

    所以,如果你这样运行它:

    pcutmp3.bat a b c
    

    它会像这样调用java:

    java -jar pcutmp3.jar --cue "a" --dir "F:\Test"
    java -jar pcutmp3.jar --cue "b" --dir "F:\Test"
    java -jar pcutmp3.jar --cue "c" --dir "F:\Test"
    

    【讨论】:

    • 嗨,迈克,感谢您的帮助!我通过简单地将 .cue 文件放在它上面来运行批处理。在尝试了你所说的之后,我只是得到/dir_path/test.cue"" unexpected at this time 不完全确定为什么......?再次感谢!
    • 我的错!我忘记了资源管理器会引用文件名。基本上,它是if ""somefile\blahbah"" == "",它不喜欢所有额外的引号。我已经更新了脚本以正确去除引号。此外,通过此更改,批处理文件不再兼容 DOS :(
    • 好的,是的,这确实有效。我非常感谢您对此的帮助。干杯!
    【解决方案2】:

    处理%1、shift 或%* 可能会因拖放而失败,因为资源管理器在创建命令行时不是很聪明。

    资源管理器不会引用Cool&stuff.cue 之类的文件,因此您会得到一个类似
    pcutmp3.bat Cool&stuff.cue 的命令行

    所以在%1 中只有Cool 即使在%* 中也只有Cool,但是在pcutmp3.bat 结束后,cmd.exe 会尝试执行stuff.cue

    要处理这些东西,您可以使用它,它使用 cmdcmdline 变量捕获所有文件名。

    @echo off
    setlocal DisableDelayedExpansion
    set index=0
    setlocal EnableDelayedExpansion
    
    rem *** Take the cmd-line, remove all until the first parameter
    rem *** Copy cmdcmdline without any modifications, as cmdcmdline has some strange behaviour
    set "params=!cmdcmdline!"
    set "params=!params:~0,-1!"
    set "params=!params:*" =!"
    echo params: !params!
    rem Split the parameters on spaces but respect the quotes
    for %%G IN (!params!) do (
        for %%# in (!index!) do (
            endlocal
            set /a index+=1
            set "item_%%#=%%~G"
            setlocal EnableDelayedExpansion
        )
    )
    
    set /a max=index-1
    
    rem list the parameters
    for /L %%n in (0,1,!max!) DO (
      echo %%n #!item_%%n!#
    )
    pause
    
    REM ** The exit is important, so the cmd.exe doesn't try to execute commands after ampersands
    exit
    

    顺便说一句。尽管“标准”批处理行限制为 8191 个字符,但拖放操作的行限制为 ~2048 个字符。

    【讨论】:

    • 嗨,jeb,是否可以扩展%%n 来获取路径?像这样:%%~pn我试过了,它返回:ECHO is off.这是我试过的echo !item_%%~pn!
    • @StephenSherry 可以扩展 %%~pn 但在此代码中 %%n 仅包含数字,因此路径没有意义。但是您可能想要获取项目的路径。但最好在有用时参考此问题/答案提出一个新问题
    • 这很好用,直到我用 ! (感叹号)。有没有好办法让!在拖动的文件名中?
    • @JG1212 我添加感叹号支持
    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2019-03-04
    • 2010-11-19
    • 2012-01-27
    相关资源
    最近更新 更多