Windows Batch for-loop。双引号的问题

时间:2012-06-06 13:32:58

标签: windows batch-file for-loop wildcard quotes

假设我想使用以下代码将文件从一个位置复制到另一个位置:

@set FILE=%1
@set SCRDIR=C:\test dir
@set DSTDIR=%SCRDIR%\temp

for %%f in ("%SCRDIR%\%FILE%") do @(
    echo Copying "%%f" to "%DSTDIR%"
    copy "%%f" "%DSTDIR%"
)

文件存在:

 C:\test dir>dir /b copyme.txt
copyme.txt

首先,我使用文件名作为我要复制的参数调用脚本:

C:\test dir>test.bat rename.txt

C:\test dir>for %f in ("C:\test dir\rename.txt") do @(
echo Copying "%f" to "C:\test dir\temp"
 copy "%f" "C:\test dir\temp"
)
Copying ""C:\test dir\rename.txt"" to "C:\test dir\temp"
The system cannot find the file specified..

上述复制命令失败,因为有额外的引号......

现在我使用包含通配符*的文件名调用脚本:

C:\test dir>test.bat copyme.*

C:\test dir>for %f in ("C:\test dir\copyme.*") do (
echo Copying "%f" to "C:\test dir\temp"
 copy "%f" "C:\test dir\temp"
)

C:\test dir>(
echo Copying "C:\test dir\copyme.txt" to "C:\test dir\temp"
 copy "C:\test dir\copyme.txt" "C:\test dir\temp"
)
Copying "C:\test dir\copyme.txt" to "C:\test dir\temp"
        1 file(s) copied.

在上面的例子中,我使用通配符,它​​完全正常。

任何人都可以解释这种行为吗?为什么我不使用通配符时会添加额外的引号?或者它是否省略了额外的引号,因为我使用通配符? 我必须引用FOR循环的path \ filename来处理包含空格的路径,因此省略这些不是一个选项。

1 个答案:

答案 0 :(得分:1)

当没有通配符时,for命令不检查文件是否存在,因此有效地将其名称视为字符串文字,包含引号。 只需使用"%%~f"代替"%%f"