2012-06-06 162 views
0

問題可以說我想要一個文件從一個位置複製到另一個與此代碼:Windows批處理循環。用雙引號

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

在上面的例子中,當使用通配符IM,它完美的罰款。

任何人都可以解釋這種行爲?爲什麼當我不使用通配符時,Windows會添加額外的引號?還是它省略了額外的引號,因爲即時通訊使用通配符? 我必須引用FOR循環的路徑\文件名以處理包含空白的路徑,因此省略這些不是一個選項。

回答

1

當沒有通配符時,for命令不檢查文件是否存在,因此有效地將其名稱視爲字符串文字,包含引號。 只需用"%%~f"代替"%%f"