2017-08-13 14 views
0

J'ai une chaîne contenant le nom de fichier comme ci-dessous des lignes de script batch:script batch tout supprimer après un texte dynamique de la chaîne/nom de fichier

set "file1=name.php_2017_23_08_12_22_07" 
set "file2=name.vbs_2016_16_12_12_13_03" 
.... 

Maintenant que vous voyez ci-dessus, la liste des noms de fichiers et leurs extensions est la variété et j'ai besoin d'obtenir les vrais noms de fichiers avec leurs extensions réelles (.php, .vbs) respectivement. Alors, quand je passe dans une fonction avec le nom de fichier avec l'extension que je devrais obtenir les noms de fichiers réels comme ci-dessous:

call :restoreFile %file2% ".vbs"

devrait me donner la sortie, en supprimant tout ce qui suit .vbs dans la %file2% variable:

name.vbs 

Et ainsi de suite pour d'autres variables aussi.

Comment définir une fonction comme celle qui déshabille une dynamique sous-chaîne de chaîne de nom de fichier?

J'ai essayé le code ci-dessous, mais cela ne fonctionne pas avec sous-chaîne dynamique ou texte, qui peut être substitué de la variable:

set targetfile=%file2:.vbs=&rem.% 

Répondre

0

Pas besoin de préciser l'extension - il est toujours au nom.

Utilisez un for /f pour diviser le premier trait de soulignement.

:restoreFile 
Set "FileName=" 
For /f "tokens=1* delims=_" %%N in ("%~1") Do Set "FileName=%%N" 
If defined FileName Echo Ren %1 %FileName% 
Goto :Eof 

Vous pouvez même mettre le date_time devant l'extension et ainsi éviter duplicates possible:

:restoreFile 
Set "FileName=" 
For /f "tokens=1* delims=_" %%N in ("%~1") Do Set "FileName=%%~nN_%%M%%~xN" 
If defined FileName Echo Ren %1 %FileName% 
Goto :Eof 

Les commandes ren sont préfixés par un écho, si la sortie semble supprimer l'écho OK.