假设我想使用以下代码将文件从一个位置复制到另一个位置:
@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来处理包含空格的路径,因此省略这些不是一个选项。
答案 0 :(得分:1)
当没有通配符时,for
命令不检查文件是否存在,因此有效地将其名称视为字符串文字,包含引号。
只需使用"%%~f"
代替"%%f"