2012-06-06 3 views
0

Disons que je veux copier un fichier d'un endroit à un autre avec ce code:Windows Batch for-loop. Problèmes avec doublequotes

@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%" 
) 

Le fichier existe:

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

Tout d'abord j'appeler le script avec le nom du fichier comme argument que je veux copier:

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

La commande de copie ci-dessus échoue, à cause des citations supplémentaires ...

Maintenant j'appeler le script avec le nom de fichier contenant un caractère générique *:

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. 

Dans l'exemple ci-dessus, où im en utilisant un caractère générique, il fonctionne parfaitement bien.

Quelqu'un peut-il expliquer ce comportement? Pourquoi Windows ajoute-t-il des guillemets supplémentaires lorsque je n'utilise pas de caractères génériques? Ou est-ce en omettant les citations supplémentaires, parce que je suis en utilisant des caractères génériques? Je dois citer le chemin \ nom de fichier pour la boucle FOR afin de gérer les chemins, qui contiennent des espaces, donc l'omettre n'est pas une option.

Répondre

1

Lorsqu'il n'y a pas de caractères génériques, la commande for ne vérifie pas si le fichier existe, traite donc son nom comme un littéral de chaîne, entre guillemets. Il suffit d'utiliser "%%~f" au lieu de "%%f"