0

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

@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.

在上面的例子中,我使用通配符,它​​工作得很好。

谁能解释这种行为?当我不使用通配符时,为什么 Windows 会添加额外的引号?还是因为我使用通配符而省略了额外的引号?为了处理包含空格的路径,我必须引用FOR循环的路径\文件名,因此省略这些不是一个选项。

4

1 回答 1

1

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

于 2012-06-06T13:44:54.623 回答