TUTOS.EU

Renuméroter en masse des fichiers qui commencent par un chiffre

Renumérote tous les fichiers d'un répertoire qui commence par un chiffre

Le script ci-dessous renumérote tous les fichiers d'un répertoire donné.
Seul les fichiers qui commencent par un chiffre sont traités.
On ajoutera ou retirera alors une valeur à se chiffre et on renommera le fichier avec.

Option Explicit

'Version du 01 janvier 2016
'Version du 30 aout 2014
'Renumérote des fichiers qui commencent par un numéro en opérant une addition ou soustraction avec une valeur définie
'Par exemple avec un décalage de 2, 077 Toto.txt sera renommé en 079 Toto.txt et 05plop.jpg en 07plop.jpg
'Vous pouvez demander une longueur de chiffre comme par exemple 4, ainsi 077 Toto.txt deviendrait 0077 Toto.txt

Call DetectExeType()

Dim objFSO, CheminScriptActuel, CheminRepertoireAExplorer
Dim objFolder, MyFile
Dim NomFichierOriginal, NomFichierRenomme
Dim NumeroFichier
Dim LongueurNumeroVise, NumeroDepart, NumeroFin, Decalage
Dim ArrayMesFichiers, varListeFichiers, CompteurTableau

Dim ChiffreDebut, ChiffreFin ', MonChiffre
Dim UneLigneDeResultat
Dim VariableaAnalyser

'Déclaration des constantes pour la lecture et l'ecriture dans les fichiers
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8

CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)
CheminRepertoireAExplorer = InputBox("Entrez le chemin du répertoire","Chemin du répertoire",CheminScriptActuel)
LongueurNumeroVise = 2
NumeroDepart = 0
NumeroFin = 100
Decalage = 1


Decalage = InputBox("Entrer la valeur à ajouter ou soustraire. Exemple : +1 ou encore -2","Valeur decalage",Decalage)
LongueurNumeroVise = InputBox("Longueur du chiffre au début du nom du fichier." & VbCrLf & "3 donnerai un fichier du style 001 MonFichier" & VbCrLf & "2 donnerai 01 MonFichier","Longueur numéro",LongueurNumeroVise)
NumeroDepart = InputBox("Entrer le chiffre de départ pour opérer le décalage. Par exemple si 2 alors tout de ce qui est égale ou supérieur à 2 sera modifié","Numéro départ",NumeroDepart)
NumeroFin = InputBox("Entrer le dernier chiffre à modifier. Par exemple si 20, alors tout de ce qui sera au dessus de 20 ne sera pas modifié","Numéro fin",NumeroFin)


Decalage = Clng(Decalage)
NumeroDepart = Clng(NumeroDepart)
NumeroFin = Clng(NumeroFin)
LongueurNumeroVise = Clng(LongueurNumeroVise)

'Création des objets
Set objFSO = CreateObject("Scripting.FileSystemObject")

'On fait un objet qui représente le répertoire à explorer
Set objFolder = objFSO.GetFolder(CheminRepertoireAExplorer)

'On fait une première passe de tout les fichiers pour stocker leur nom dans un tableau. Cela servira à ne pas les traiter 2 fois, cad que quand un fichier est renommé, comme il porte un nouveau nom, il risque d'être traité une second fois dans une boucle qui scrute tous les fichiers d'un répertoire
For Each MyFile In objFolder.Files
	varListeFichiers = varListeFichiers & MyFile.Name & ";"
Next

'On va maintenant traiter les fichiers contenus dans le tableau
If Len(varListeFichiers) > 0 Then 'Si j'ai bien récupéré une liste de fichiers
	varListeFichiers = Left(varListeFichiers, Len(varListeFichiers)-1) 'On supprime le dernier caractère qui correspond à ;
	ArrayMesFichiers = Split(varListeFichiers, ";") 'On crée un tableau avec la liste des fichiers
	'Wscript.Echo "1 : " & ArrayWithMyLine(0)
	
	'Pour tous les fichiers contenus dans le tableau
	For CompteurTableau = LBound(ArrayMesFichiers) To Ubound(ArrayMesFichiers)
	
		NomFichierOriginal = ArrayMesFichiers(CompteurTableau)
		Wscript.echo NomFichierOriginal

		If Len(NomFichierOriginal) > LongueurNumeroVise Then

			Call FindFirstNum(NomFichierOriginal, ChiffreDebut, ChiffreFin, NumeroFichier)
			
			If ((ChiffreDebut = 1) And (IsNumeric(NumeroFichier))) Then 'Si on a bien trouvé un chiffre et qu'il est en première position
				'NumeroFichier = Left(NomFichierOriginal,LongueurNumeroVise) 'Récupération du numéro du fichier

				Wscript.echo VbTab & "Commence bien par un chiffre. Il a une longueur de " & Len(NumeroFichier) 'LongueurNumeroVise

				'NomFichierRenomme = Mid(NomFichierOriginal, LongueurNumeroVise+1) 'Récupération du nom du fichier
				NomFichierRenomme = Mid(NomFichierOriginal, Len(NumeroFichier)+1) 'Récupération du nom du fichier
				Wscript.echo VbTab & "Nom du fichier sans le numéro : " & NomFichierRenomme

				Wscript.echo VbTab & "LongueurNumeroVise : " & LongueurNumeroVise
				Wscript.echo VbTab & "NumeroFichier : " & NumeroFichier
				Wscript.echo VbTab & "NomFichierOriginal : " & NomFichierOriginal
				
				NumeroFichier = Clng(NumeroFichier)
				If (NumeroFichier >= NumeroDepart) And (NumeroFichier <= NumeroFin) Then
					NumeroFichier = NumeroFichier + Decalage
					Wscript.echo VbTab & "Numero de fichier avec decalage de " & Decalage & " : " & NumeroFichier

					Do while Len(NumeroFichier) > LongueurNumeroVise 'On rétrécit le numéro du fichier pour qu'il atteigne la longueur demandée
						NumeroFichier = Mid(Cstr(NumeroFichier), 2) 'On supprime le premier caractère en partant par la gauche
					Loop					
					
					Do while Len(NumeroFichier) < LongueurNumeroVise 'On complète le numéro de fichier avec des 0 pour qu'il atteigne la longueur demandée
						NumeroFichier = "0" & Cstr(NumeroFichier)
					Loop

					'If (LongueurNumeroVise = 2) Then
						'If Len(cstr(NumeroFichier)) = 1 Then NumeroFichier = Cstr("0" & NumeroFichier)
					'End If
					'If LongueurNumeroVise = 3 Then
						'If (Len(cstr(NumeroFichier)) = 1) Then NumeroFichier = Cstr("00" & NumeroFichier)
						'If (Len(cstr(NumeroFichier)) = 2) Then NumeroFichier = Cstr("0" & NumeroFichier)
					'End If

					NomFichierRenomme = NumeroFichier & NomFichierRenomme
					Wscript.echo VbTab & "NomFichierRenomme : " & NomFichierRenomme

					Set MyFile = objFSO.GetFile(CheminRepertoireAExplorer & "\" & NomFichierOriginal)
					MyFile.Name = NomFichierRenomme
					Set MyFile = Nothing
				Else
					Wscript.echo VbTab & NumeroFichier & " est un numéro qui n'a pas à être traité"
				End If
					
			Else
				Wscript.echo VbTab & "Pas de chiffre en début de position de " & NomFichierOriginal
			End If

		Else
			Wscript.echo VbTab & NomFichierOriginal & " a un nom trop court"
		End If
		Wscript.echo ""
		
	Next
			
End If


Set objFolder = Nothing
Set objFSO = Nothing

Wscript.echo "Terminé !"

Sub FindFirstNum(ByVal VariableaAnalyser, Byref ChiffreDebut, Byref ChiffreFin, Byref MonChiffre)

	Dim Compteur

	'Dans une chaine de caractère, retourne la première série de chiffres consécutive
	'Par exemple pour "Bol  234 5 raid 6" on retournera 234
	'ChiffreDebut correspond à la position du début du chiffre dans la chaîne. 1 correspond à la toute première position. 0 veut dire que l'on n'a rien trouvé
	'ChiffreFin correspond à la position du dernier chiffre dans la chaîne.
	'MonChiffre : le premier chiffre que l'on a trouvé dans la chaîne

	ChiffreDebut = 0 'Valeur par défaut
	ChiffreFin = 0 'Valeur par défaut
	Compteur = 1 'On se positionne au début de la ligne

	'Analyse de la ligne de gauche à droite
	Do

		If IsNumeric(Mid(VariableaAnalyser, Compteur, 1)) = True Then 'Si le caractère scruté est un chiffre
			ChiffreDebut = Compteur
			Exit Do
		Else 'Si on n'a pas encore trouvé de chiffre, on incrémente de 1
			Compteur = Compteur + 1
		End If

	Loop While (ChiffreDebut = 0 And (Compteur =< Len(VariableaAnalyser))) ' (IsNumeric(Mid(VariableaAnalyser, Compteur, 1)) = False)

	If ChiffreDebut > 0 Then 'Si on a trouvé le début d'un chiffre

		'Wscript.echo ChiffreDebut

		ChiffreFin = ChiffreDebut 'Par défaut la fin du chiffre est un digit après le début
		Compteur = ChiffreDebut 'On se positionne au début du chiffre trouvé
		Do

			If IsNumeric(Mid(VariableaAnalyser, Compteur, 1)) = False Then 'Si le caractère scruté n'est plus un chiffre
				ChiffreFin = Compteur - 1
				Exit Do
			Else 'Si on a encore trouvé un chiffre, alors on avant au caractère suivant mais on note le résultat
				ChiffreFin = Compteur
				Compteur = Compteur + 1
			End If

		Loop While (Compteur =< Len(VariableaAnalyser)) 'Tant que l'on n'est pas arrivé à la fin de la ligne
		'Wscript.echo ChiffreFin
		
		MonChiffre = Mid(VariableaAnalyser, ChiffreDebut, (ChiffreFin - ChiffreDebut) + 1)
		Wscript.echo MonChiffre

	Else
		Wscript.echo "Pas de chiffre trouvé"
	End If

End Sub

Sub DetectExeType()
	'Version du 10 juillet 2008

	Dim ScriptHost
	Dim ShellObject

	Dim CurrentPathExt
	Dim EnvObject

	Dim RegCScript
	Dim RegPopupType ' This is used to set the pop-up box flags.
											' I couldn't find the pre-defined names
	RegPopupType = 32 + 4

	On Error Resume Next

	ScriptHost = WScript.FullName
	ScriptHost = Right(ScriptHost, Len(ScriptHost) - InStrRev(ScriptHost, "\"))

	If (UCase(ScriptHost) = "WSCRIPT.EXE") Then
		WScript.Echo ("This script does not work with WScript.")

		' Create a pop-up box and ask if they want to register cscript as the default host.
		Set ShellObject = WScript.CreateObject("WScript.Shell")
		' -1 is the time to wait.  0 means wait forever.
		RegCScript = ShellObject.PopUp("Would you like to register CScript as your default host for VBscript?", 0, "Register CScript", RegPopupType)
		                                                    
		If (Err.Number <> 0) Then
			ReportError ()
			WScript.Echo "To run this script using CScript, type: ""CScript.exe " & WScript.ScriptName & """"
			WScript.Quit (GENERAL_FAILURE)
			WScript.Quit (Err.Number)
		End If

		' Check to see if the user pressed yes or no.  Yes is 6, no is 7
		If (RegCScript = 6) Then
			ShellObject.RegWrite "HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
			ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
			' Check if PathExt already existed
			CurrentPathExt = ShellObject.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT")
			If Err.Number = &H80070002 Then
				Err.Clear
				Set EnvObject = ShellObject.Environment("PROCESS")
				CurrentPathExt = EnvObject.Item("PATHEXT")
			End If

			ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT", CurrentPathExt & ";.VBS", "REG_SZ"

			If (Err.Number <> 0) Then
				ReportError ()
				WScript.Echo "Error Trying to write the registry settings!"
				WScript.Quit (Err.Number)
			Else
				WScript.Echo "Successfully registered CScript"
			End If
		Else
			WScript.Echo "To run this script type: ""CScript.Exe adsutil.vbs <cmd> <params>"""
		End If

		Dim ProcString
		Dim ArgIndex
		Dim ArgObj
		Dim Result

		ProcString = "Cscript //nologo " & WScript.ScriptFullName

		Set ArgObj = WScript.Arguments

		For ArgIndex = 0 To ArgCount - 1
				ProcString = ProcString & " " & Args(ArgIndex)
		Next

		'Now, run the original executable under CScript.exe
		Result = ShellObject.Run(ProcString, 0, True)

		WScript.Quit (Result)
	End If

End Sub
Lien vers le fichier : cliquez ici