我有一个处理已删除文件的for循环,但我最近遇到了一个文件名为&
的文件,我收到错误& was unexpected at this time
。所以我不确定为什么会这样做,我把它括在引号中。
文件名示例:[This_&_That]_FileName.txt
小例子:
FOR /F "tokens=* delims=;" %%P in ("%*") do call :LOOP %%P
:LOOP
if '%1'=='' goto :endloop
echo %1
pause
....
:endloop
exit
这适用于空格,但使用&
符号会崩溃。我必须使用文件名作为参数从cmd
运行.bat文件,以查看错误。
我尝试过启用delayedexpansion - 就像在这篇文章中所做的那样,我没有正确地做到这一点,或者它对我不起作用:stackoverflow post
答案 0 :(得分:3)
如果文件名不包含空格字符,则资源管理器不会用 drag& amp;的双引号括起来。删除操作。因此,您无法在批处理文件中正确使用&符号(&
)处理此类文件名。
假设您有以下批次script.bat
:
@ECHO Off &SETLOCAL
:loop
ECHO "%~1"
SHIFT /1
IF NOT "%~1"=="" GOTO :loop
pause
制作两个文件,例如。在命令行上:
type nul>"This_&_That.txt"
type nul>"This & That.txt"
现在转到资源管理器,拖动两个文件并将其放在script.bat
让我们看看会发生什么:
"C:\TEST\This & That.txt" "C:\TEST\This_" press any key to continue . . .
答案 1 :(得分:0)
您不需要子程序:LOOP。你能忍受%% P周围的报价吗?
FOR /F "tokens=* delims=;" %%P in ("%*") do echo."%%P" & pause
答案 2 :(得分:0)
在这一行:
if '%1'=='' goto :endloop
%1
的值不是用引号括起来的,而是用撇号括起来的。改变方式:
if "%1"=="" goto :endloop
当然,您还需要在调用程序的子例程和%1
周围的echo
命令中将%%P
括在引号中,但在这种情况下,{的值为{ {1}} woud已经有引号
答案 3 :(得分:0)
嗯...因为我认为你是我们在子程序中使用你的代码......我将忽略关于我的单行建议没有CALL的评论。我们应该挑选一个问题并解决它而不是来回反弹。在您的示例中,您需要引用%% P。子程序的典型做法是做“%~1”。代字号删除了引号,如果需要,“”会再次将它们放回去。有时他们不需要,但在你的情况下他们是需要的。您的CALL使用:LOOP和您使用的示例:ENCODE。我将回复:LOOP。
FOR /F "tokens=* delims=;" %%P in ("%*") do call :LOOP "%%P"
:LOOP
if "%~1"=="" goto :endloop
REM ----VARS-----
set "f=%~n1"
set fn=%f: =_%
set var=%tempd%\%fn%_new.txt
set var2=%tempd%\%fn%_new2.txt
echo "%~1"
echo.
echo %var%
echo.
echo %var2%
pause
REM this is some but in continues on
echo.done & PAUSE