1

我有一个处理删除文件的 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 文件才能看到错误。

我已经尝试启用延迟扩展 - 就像在这篇文章中一样,要么我没有正确执行它,要么它对我不起作用:stackoverflow post

4

4 回答 4

3

Windows 资源管理器错误

如果文件名不包含空格字符,则资源管理器不会用双引号将其括起来以进行拖放操作。因此,您无法&在批处理文件中正确处理带有与号 ( ) 的此类文件名。

假设您有以下批次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_"
按任意键继续 。. .


扩展解释。

于 2013-06-29T22:12:46.790 回答
0

嗯....因为我认为您是我们将您的代码与子例程一起使用...我将忽略有关我的单行建议的评论,而无需调用。我们应该选择一个问题并解决它,而不是来回反弹。在您的示例中,您需要引用 %%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
于 2013-06-29T21:48:22.713 回答
0

您不需要子程序 :LOOP。你能忍受 %%P 周围的报价吗?

FOR /F "tokens=* delims=;" %%P in ("%*") do echo."%%P" & pause
于 2013-06-29T20:04:25.723 回答
0

在这一行:

if '%1'=='' goto :endloop

的值%1不是用引号括起来,而是用撇号括起来。以这种方式更改它:

if "%1"=="" goto :endloop

当然,你也需要在子程序中和调用程序%1中的命令中加上引号,但是在这种情况下,woud的值已经有引号了echo%%P%1

于 2013-06-29T20:59:58.773 回答