Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何获取到的Windows cmd';玩得好';带拖放功能_Batch File_For Loop_Cmd_Drag And Drop_Msys - Fatal编程技术网

Batch file 如何获取到的Windows cmd';玩得好';带拖放功能

Batch file 如何获取到的Windows cmd';玩得好';带拖放功能,batch-file,for-loop,cmd,drag-and-drop,msys,Batch File,For Loop,Cmd,Drag And Drop,Msys,我有一个非常直接的小批量脚本。设计大纲很简单。。。我想触摸掉的每一个文件 桌面上有一个调用批处理(.cmd)脚本的Windows快捷方式 使用Windows资源管理器选择一些文件 将所选内容直接拖放到快捷图标或命令文件上 脚本在图标上的文件列表上循环 脚本使用FOR命令一次调用一个文件 无论如何,在某些情况下,结果是奇怪的(至少可以说)。最糟糕的例子是导致cmd.exe崩溃的无限循环。这是命令文件。这里有额外的指纹和停顿,所以我可以观察它的行为 @echo关闭 @标题触摸 @回声。 cd>z:\

我有一个非常直接的小批量脚本。设计大纲很简单。。。我想触摸掉的每一个文件

  • 桌面上有一个调用批处理(.cmd)脚本的Windows快捷方式
  • 使用Windows资源管理器选择一些文件
  • 将所选内容直接拖放到快捷图标或命令文件上
  • 脚本在图标上的文件列表上循环
  • 脚本使用FOR命令一次调用一个文件
  • 无论如何,在某些情况下,结果是奇怪的(至少可以说)。最糟糕的例子是导致cmd.exe崩溃的无限循环。这是命令文件。这里有额外的指纹和停顿,所以我可以观察它的行为

    @echo关闭
    @标题触摸
    @回声。
    cd>z:\$$\base.tmp
    set/p base=[%%~x]
    @回显^each--^>[%%~fx]
    属性“%%~fx”
    触摸“%%~fx”
    回声。
    @停顿
    回声。
    )
    @回声。
    @回声^[完成]
    @回声。
    @停顿
    
    对我来说,最有问题的输出是一个混乱的来源,请参见:示例1。我输入了attrib命令,因为它是一个“tame”system.exe

    当您注释掉“touch”命令时,外观在大多数情况下仅与attrib一起工作。我唯一可以肯定的是,带有空格的文件名会导致问题。例如,在echo ed“每一行”中,我看到了如下示例:

    • each-->[Z:\tmp\“Z:\tmp\C++Recipes.pdf”]
    • “G:\\u xfer\um”
    第一个问题似乎是FOR循环扩展及其如何处理引号(“)的问题,而第二个问题似乎是MSYS touch.exe命令的越界错误

    当您将链接(快捷)文件传递到脚本时,fish也会进行一些操作

    我尝试了许多不同版本的FOR语法和循环变量转义来回避这个问题。毕竟,我的主要目的是拥有一个GUI触摸命令。我对brains trust的第一个问题是:

  • 什么是适当的FOR和循环变量扩展用于此
  • 还有,因为它已经成为一个谜

  • 无限循环是如何发生的,有没有办法阻止它
  • 是否有人有文档链接和/或带有拖放窗口的示例
  • 脚本如何显示:
    工作文件夹…
    G:\\u xfer\u
    当字符串“Working folder”(不在.cmd脚本中)出现时,曾经有一个版本有命令:
    echo Working folder:
  • 这很有帮助,我在下面也放了一个名为“drop.cmd”的小脚本。最后一点,我怀疑Windows的MSYS/GNU命令行处理程序中有一个bug:

    • 看起来,当传递的
      *args
      包含一个带有不平衡引号的字符串时,它可能会退出保留
    我从MSYStouchtail命令中获得了与下面示例1类似的输出

    我马上就要签字了。还有一件事要考虑。有没有人可以用脚本或诊断来“拆开”这个毛线?< / P > 例1 并最终与stackoverflow一起崩溃

    drop.cmd
    @echo关闭
    @标题%1
    @回声。
    cd>z:\$$\base.tmp
    set/p base=[%%~x]
    @回声。
    @停顿
    )
    @回声。
    @回声^[完成]
    @回声。
    @停顿
    
    获取批处理文件句柄删除的文件有时会很困难。任何名称中带有空格的拖动文件都将被引用,但带有特殊字符(
    &
    )但没有空格的文件将不会被引用。这将导致解析器使用
    %*
    处理文件的参数时出现问题

    但是,只有在从命令行(其中参数“应该”格式良好)或从
    %cmdline%
    (保存用于启动当前
    cmd
    实例的命令行)调用时,才使用and来解决问题(谢谢大家),并从
    %*
    检索参数当我们放弃时,我们可以做类似的事情

    @echo关闭
    setlocal enableextensions disabledelayedexpansion
    设置“var=”
    确定呼叫来源
    延迟扩展
    呼叫:detectDrop!cmdline!
    端部
    如果不是错误级别1转到:已放弃
    :命令行
    从命令行调用rem
    设置“已删除=”
    如果“%~1”==”转到“完成”
    设置变量=%*
    设置“var=%var:=”%
    后藤:过程
    :下降
    从资源管理器调用的rem
    设置“已删除=1”
    设置“var=%cmdline:=”%
    设置“var=%var:**/c”“”“=%”
    设置“var=%var:*”=%
    设置“var=%var:~0,-2%
    :进程
    如果未定义var goto:done
    rem根据dbenham在[https://stackoverflow.com/a/7940444/2861476]
    设置“var=%var:^=^^%
    设置“var=%var:&=^&%”
    设置“var=%var:|=^ |%
    设置“var=%var:%”
    设置“var=%var:=^^^%
    设置变量=%var:“”%
    设置“var=%var:=”Q%
    设置“var=%var:=”S“S%”
    设置“var=%var:^^=%”
    设置“var=%var:”“=”%
    延迟扩展
    设置“var=!var:”Q=!"
    对于%%a in(“!var:”S“S=”“!”)执行(
    如果“!!”==“endlocal”
    rem这里我们有一个对传递/删除元素的引用
    如果%%a neq“echo”%%~fa
    )
    后藤:完成了
    :detectDrop cmdline
    如果/i“%~1”==%comspec%”如果/i“%~2”==“/c”退出/b 0
    退出/b 1
    :完成
    如果定义已删除(暂停和退出)
    
    folder: G:\_xfer_ INPUT: ["G:\_xfer_\00__zip (on D).lnk" G:\_xfer_\#trash.lnk] Press any key to continue . . . RAW: ["G:\_xfer_\00__zip (on D).lnk"] each --> [G:\_xfer_\00__zip (on D).lnk] each --> [G:\_xfer_\00__zip (on D).lnk] A G:\_xfer_\00__zip (on D).lnk all ... G:\_xfer_\00__zip (on D).lnk one ... G:\_xfer_\00__zip two ... (on Working folder ... G:\_xfer_ touch -m -c "G:\_xfer_\-m" Working folder ... G:\_xfer_ touch -m -c "G:\_xfer_\-m" : :
    @echo off
    @title  %~1
    @echo.
    cd > z:\$$$\base.tmp
    set /p base= < z:\$$$\base.tmp
    @rem
    @echo  ^  drop folder: %base%
    @echo  ^  INPUT:       [%*]
    @echo.
    @pause
    rem
    @echo.
    for   %%x  in  (%*)  DO ( 
        @echo ^    RAW:      [%%x]
        @echo ^    each --^>  [%%~x]
        @echo.
        @pause
    )
    @echo.
    @echo ^  [done]
    @echo.
    @pause