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:\
@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”
工作文件夹…
G:\\u xfer\u
当字符串“Working folder”(不在.cmd脚本中)出现时,曾经有一个版本有命令:echo Working folder:
- 看起来,当传递的
包含一个带有不平衡引号的字符串时,它可能会退出保留*args
@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