Le problème le plus probable est pas dans votre script « move », mais plutôt dans le code qui appelle le script « move ».
Chaque fois que vous passez une chaîne littérale qui peut contenir délimiteurs jeton comme <space>
, <tab>
, =
, ;
, ,
, ou des caractères spéciaux comme &
etc., vous devez placer l'argument entre guillemets.
Supposons que votre script est appelé moveFile.bat
, et que vous voulez déplacer c:\some path with spaces\yourFile
, votre appel devrait ressembler à:
call moveFile arg1 "some path with spaces\yourFile"
Votre script exécutera alors correctement
move D:\"some path with spaces\yourFile" D:\KUMAR_398519667_9262017
Si vous omettez de citer l'argument, alors %2
sera analysé comme c:\some
, et bien sûr cela ne fonctionnera pas.
Certains diront que vous devez utiliser %~2
pour enlever les guillemets enserrant existant, puis ajouter explicitement votre propre autour du chemin d'accès complet, comme dans
move "D:\%~2" D:\KUMAR_398519667_9262017
Dans ce cas, la commande exécutée devient plus familier à la recherche
move "D:\some path with spaces\yourFile" D:\KUMAR_398519667_9262017
Cela fonctionne certainement aussi bien, mais ce n'est pas nécessaire. Il existe un problème potentiel avec la conception globale: elle ne peut pas prendre en charge les chemins qui contiennent à la fois des espaces et des carets (^) car le chemin doit être cité, mais l'instruction CALL double tous les carets.
donc call moveFile arg1 "some path with spaces\A^B.txt"
se traduira par les éléments suivants:
move D:\"some path with spaces\A^^B.txt" D:\KUMAR_398519667_9262017
Il n'y a absolument rien que vous pouvez faire pour empêcher le caret cité doubler lorsque vous utilisez CALL. La meilleure option est de transmettre vos chemins par référence en tant que nom de variable. Évidemment, cela nécessite de changer moveFile.chauve-souris:
Voici les modifications nécessaires pour moveFile.bat:
setlocal enableDelayedExpansion
if not exist "D:\KUMAR_398519667_9262017" mkdir D:\KUMAR_398519667_9262017
move "D:\!%2!" D:\KUMAR_398519667_9262017
Et votre code qui appelle MoveFile devrait ressembler à:
set "myFile=some path with spaces\A^B"
call moveFile arg1 myFile
Il n'y a aucune raison que les périodes supplémentaires auraient jamais qui affectent sur votre script. Espaces, bien sûr, mais pas des périodes. Toujours envelopper tous les chemins de fichier entre guillemets. – SomethingDark
@SomethingDark - mais les citations sont nécessaires dans le code appelant, pas nécessairement dans le script de déplacement. Voir [ma réponse] (https://stackoverflow.com/a/46864937/1012053) – dbenham