当文件拖放到脚本上时.bat "^"从 Windows 脚本中的文件名中删除.bat



我不是一个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^DuckDagobert ^DuckCat&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&ampersand!exclam%percent.bat

这是的结果

----qcifn.bat--"U:Test space^caret&ampersand!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&ampersand!exclam%percent.bat"
""U:Test spacecaret
'ampersand!exclam%percent.bat""' is not recognized as an internal or external command,
operable program or batch file.

最新更新