我不是一个Windows用户,但我需要编写一个简单的.bat脚本来自动从一个文件和几个其他文件夹构建一个文件夹。我想将一个文件夹拖放到.bat脚本上以执行该脚本。
问题是许多文件夹名称将具有"^"登录文件夹的名称,当我将这些文件夹拖放到.bat脚本上时;脚本中有文件夹名称,但由于某种原因,"^"字符被去掉了。
有没有一种方法可以在不丢失"^"字符的情况下获得文字文件夹名称?
我在这个例子中添加了更多的信息。我的.bat文件类似于:
@echo off
echo %~1
mkdir USB
xcopy /s radiantUSB USB
move "%~1" USB
echo "FINISHED"
@pause
我放在.bat文件上的文件夹的名称是:
Duck^Donald^Quack
它提取的路径是:
C:UserssscottiDesktopDuckDonaldQuack
"^"已删除并移动"%"~1〃;USB\失败,因为要移动的文件夹路径不正确。
如果没有引用%1
或%*
,则无法获取单个插入符号^
。这是因为,cmd.exe
使用插入符号作为转义符,并将其从参数中删除。
但在隐藏变量cmdcmdline
中,所有字符都存在。
这适用于几乎所有的特殊角色
使用Donald^Duck
、Dagobert ^Duck
、Cat&Dog
进行测试
它只对Cat&dog()
这样的文件名失败。要做到防弹,你需要一个额外的"自动运行"批处理文件,它修复了拖动&跌落处理。
@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
使用%~1
,而不是%1
。
处理批次中字符的特殊含义是另一个问题。既然你没有向我们展示你的批次,那么一段字符串有多长?
这是我的测试批次
@ECHO OFF
ECHO ----%~nx0--%*
SETLOCAL
ECHO "%1"
ECHO "%~1"
ECHO "%*"
pause
GOTO :EOF
测试文件名为U:Test space^caret&ersand!exclam%percent.bat
这是的结果
----qcifn.bat--"U:Test space^caret&ersand!exclam%percent.bat"
""U:Test spacecaret
'ampersand!exclam%percent.bat""' is not recognized as an internal or external command,
operable program or batch file.
"U:Test space^caret&ersand!exclam%percent.bat"
""U:Test spacecaret
'ampersand!exclam%percent.bat""' is not recognized as an internal or external command,
operable program or batch file.