我正在尝试使用我认为应该看起来像这样的解决方案从拖放选择中复制多个文件和文件夹:
mkdir newdir
for %%a in ("%*") do (
echo %%a ^ >>new.set
)
for /f "tokens=* delims= " %%b in ('type "new.set"') do (
SET inset=%%b
call :folderchk
if "%diratr%"=="d" robocopy "%%b" "newdir" "*.*" "*.*" /B /E && exit /b
copy /Y %%b newdir
)
exit /b
:folderchk
for /f tokens=* delims= " %%c in ('dir /b %inset%') do (
set atr=%~ac
set diratr=%atr:~0,1%
)
我已经尝试过将以下示例中的代码放在一起,但我被卡住了:
http://ss64.com/nt/syntax-dragdrop.html
答案 0 :(得分:0)
使用Drag& Drop处理特殊字符非常棘手,因为不能以可靠的方式引用它们。
空格不是很复杂,因为带有空格的文件名会自动引用 但是有两个特殊字符,可以产生问题,感叹号和&符号。
带有&符号的名称不会自动引用,因此可以通过这种方式调用批处理
myBatch.bat Cat&Dog.txt
这会产生两个问题,首先是参数不完整
在%1
和%*
中,只有文字Cat
&Dog.txt
部分无法通过常规参数访问,而是通过cmdcmdline
变量访问。
这应该通过延迟扩展来扩展,否则可以从文件名中删除感叹号和插入符号
当批处理结束时,它应该使用exit
命令关闭cmd窗口,否则&Dog.txt
将执行并且通常会产生错误。
因此,阅读文件名列表应该看起来像
@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 %%N IN (!params!) do (
echo %%N
)
pause
REM ** The exit is important, so the cmd.ex doesn't try to execute commands after ampersands
exit
中也对此进行了描述