2017-10-21 34 views
0

J'ai besoin de déplacer les fichiers en créant un nouveau dossier. Pour ce qui suit, le code est écrit. Cela fonctionne parfaitement bien.Remplacer les points et les caractères spéciaux dans le nom du fichier avant de le déplacer vers un autre emplacement

Mais le code échoue lorsque le nom de fichier contient des points, des espaces et des caractères spéciaux supplémentaires (tels que des parenthèses).

Veuillez me faire savoir comment remplacer/renommer les points, les espaces et les caractères spéciaux avant de déplacer le fichier vers l'emplacement cible.

if not exist "D:\KUMAR_398519667_9262017" mkdir D:\KUMAR_398519667_9262017 
move D:\%2 D:\KUMAR_398519667_9262017 

Remarque:% 2 est le nom de fichier transmis au fichier chauve à partir de la procédure de déclenchement.

Merci à l'avance.

+1

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

+0

@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

Répondre

0

Il suffit de mettre des guillemets autour du nom:

move "D:\%~2" "D:\KUMAR_398519667_9262017" 
0

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 
+0

Salut dbenham, merci pour la réponse détaillée, il semble y avoir un problème avec la procédure d'appel, j'appelle le fichier chauve-souris de l'esquisse Siebel. Après avoir ajouté les guillemets doubles dans le script de fichier bat, il fonctionne très bien en l'exécutant sur cmd ainsi qu'en double-cliquant. Mais la même chose ne fonctionne pas lorsque vous essayez d'exécuter le fichier bat à partir du script siebel. Le code Siebel est le suivant: – Kumar

+0

Le code Siebel est le suivant: "batstatus = Clib.system (" D: \\ MoveFiles.bat "+" "+ sDestDir +" "+ sUnCompFilePath);" où sDesDir est l'argument du répertoire cible et sUnCompFilePath est le chemin du fichier. Je vous remercie. – Kumar

+0

@Kumar - Essayez de créer la chaîne complète dans Siebel et imprimez-la sur l'écran ou le fichier, sans l'exécuter. Une fois que vous obtenez la syntaxe correcte, passez cette chaîne à 'Clib.system()'. – dbenham