对于/ f循环进程文件名&符号

时间:2013-06-29 19:36:50

标签: windows batch-file parameters filenames

我有一个处理已删除文件的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

4 个答案:

答案 0 :(得分:3)

Windows资源管理器错误

如果文件名包含空格字符,则资源管理器不会用 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 . . .


Extended explanation.

答案 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