А я в извращенной форме (и с очень конкретными, специфическими именами файлов) смог 7 ТБ авишек переименовать и в итоге приклеить к PVD. На досуге выложу свой вариант, может кому и подойдет. Всё заняло всего один день и все файлы имеют теперь такой вид: Русское название (год)/Оригинальное_Название_(год)(озвучка)(качество).расширение При помощи скрипта одного, написанного под мои нужды. Основное, что нужно, это заполненная база PVD к которой подцеплены все файлы, одно пользовательское поле с озвучкой, например: (one);(two);(multi);(multi_d);(multi_z) - одноголосый, двухголосый, многоголосый, многоголосый дубляж, многоголосый закадровый и одно заполненное поле качество, например: (dvdrip);(hdrip);(tvrip);(satrip). И если у фильма не один файл, а более, то обязательно должен быть такой вид: любое название (CD1).расширение. Вот. Если есть возможность иметь указанные данные, то дело займет несколько минут. Ну или если кто шарит в програмировании думаю можно и скрипт поправть просто. Впринципе, вот код, сразу говорю, я в этом ничего не шарю, мне друг по быстрому накидал:
	Set fso = CreateObject("Scripting.FileSystemObject")
	Set ADOConn=CreateObject("ADODB.Connection")
	ADOConn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\films_catalogs\PVD\Content\scripts\data.mdb;"
	ADOConn.Open
	Set QueryResult=CreateObject("ADODB.recordset")
	Set Cmd = CreateObject("ADODB.Command")
	Cmd.ActiveConnection = ADOConn
	QueryResult.Open "Select  * from films where movienum>0", ADOConn,3
	QueryResult.MoveFirst
	While not QueryResult.EOF
	AllPaths=QueryResult.fields("Path").value
	AllPathsNew=""
	SepPos=Instr(1,AllPaths,"|")
	MovieNum=cint(QueryResult.fields("movienum").value)
	while SepPos>0
		CurrentPath=mid(AllPaths,1,SepPos-1)
		AllPaths=Mid(AllPaths,SepPos+1,Len(AllPaths)-SepPos)
		FolderName=QueryResult.fields("Title").value
		FbdnSym=Instr(1,FolderName,"/")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"/")
		wend
		
		FbdnSym=Instr(1,FolderName,"\")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"\")
		wend
		FbdnSym=Instr(1,FolderName,"|")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"|")
		wend
		
		FbdnSym=Instr(1,FolderName,"?")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"?")
		wend
		
		FbdnSym=Instr(1,FolderName,"*")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"*")
		wend
		
		FbdnSym=Instr(1,FolderName,":")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"-"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,":")
		wend
		
		FbdnSym=Instr(1,FolderName,">")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,">")
		wend
		
		FbdnSym=Instr(1,FolderName,"<")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"<")
		wend
		
		FbdnSym=Instr(1,FolderName,"""")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"'"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"""")
		wend
		NewPath=mid(CurrentPath,1,Instr(4,CurrentPath,"\"))+FolderName+" ("+cstr(QueryResult.fields("Year").value)+")"
		
		if not FSO.FolderExists(NewPath) then
			set f=FSO.CreateFolder(NewPath)
		end if
		SerNum=""
		for i=1 to 1000
			if instr(1,CurrentPath,"(CD"+cstr(i)+")")> 0 then
				SerNum="(CD"+cstr(i)+")"
				i=1000
			end if
		next
		j=Len(CurrentPath)
		while mid(CurrentPath,j,1)<>"." and j>0
			j=j-1
		wend
		
			
		FileNameNew=QueryResult.fields("Original Title").value+"_("+cstr(QueryResult.fields("Year").value)+")"+"("+cstr(QueryResult.fields("Voice").value)+")"+"("+cstr(QueryResult.fields("Quality").value)+")"+SerNum+mid(CurrentPath,j,Len(CurrentPath)-j+1)
		
		FolderName=FileNameNew
		
		FbdnSym=Instr(1,FolderName,"/")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"/")
		wend
		
		FbdnSym=Instr(1,FolderName,"\")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"\")
		wend
		FbdnSym=Instr(1,FolderName,"|")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"|")
		wend
		
		FbdnSym=Instr(1,FolderName,"?")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"?")
		wend
		
		FbdnSym=Instr(1,FolderName,"*")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"*")
		wend
		
		FbdnSym=Instr(1,FolderName,":")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"-"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,":")
		wend
		
		FbdnSym=Instr(1,FolderName,">")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,">")
		wend
		
		FbdnSym=Instr(1,FolderName,"<")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"<")
		wend
		
		FbdnSym=Instr(1,FolderName,"""")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"'"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"""")
		wend
		FbdnSym=Instr(1,FolderName," ")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"_"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName," ")
		wend
		FileNameNew=FolderName
		NewPath=NewPath+"\"+FileNameNew
			
		AllPathsNew=AllPathsNew+NewPath+"|"
		if 	CurrentPath<>NewPath then
			if fso.FileExists(CurrentPath) then
				set CurrentFile=fso.GetFile(CurrentPath)
				CurrentFile.Move NewPath
			else
				msgbox "Файл "+CurrentPath+" не найден"
			end if	
		END IF
		
		
		SepPos=Instr(1,AllPaths,"|")
	wend
	
		CurrentPath=AllPaths
		FolderName=QueryResult.fields("Title").value
		FbdnSym=Instr(1,FolderName,"/")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"/")
		wend
		
		FbdnSym=Instr(1,FolderName,"\")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"\")
		wend
		FbdnSym=Instr(1,FolderName,"|")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"|")
		wend
		
		FbdnSym=Instr(1,FolderName,"?")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"?")
		wend
		
		FbdnSym=Instr(1,FolderName,"*")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"*")
		wend
		
		FbdnSym=Instr(1,FolderName,":")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"-"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,":")
		wend
		
		FbdnSym=Instr(1,FolderName,">")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,">")
		wend
		
		FbdnSym=Instr(1,FolderName,"<")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"<")
		wend
		
		FbdnSym=Instr(1,FolderName,"""")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"'"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"""")
		wend
		NewPath=mid(CurrentPath,1,Instr(4,CurrentPath,"\"))+FolderName+" ("+cstr(QueryResult.fields("Year").value)+")"
		
		if not FSO.FolderExists(NewPath) then
			set f=FSO.CreateFolder(NewPath)
		end if
		SerNum=""
		for i=1 to 1000
			if instr(1,CurrentPath,"(CD"+cstr(i)+")")> 0 then
				SerNum="(CD"+cstr(i)+")"
				i=1000
			end if
		next
		j=Len(CurrentPath)
		while mid(CurrentPath,j,1)<>"." and j>0
			j=j-1
		wend
		
				
		FileNameNew=QueryResult.fields("Original Title").value+"_("+cstr(QueryResult.fields("Year").value)+")"+"("+cstr(QueryResult.fields("Voice").value)+")"+"("+cstr(QueryResult.fields("Quality").value)+")"+SerNum+mid(CurrentPath,j,Len(CurrentPath)-j+1)
		
		FolderName=FileNameNew
		
		FbdnSym=Instr(1,FolderName,"/")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"/")
		wend
		
		FbdnSym=Instr(1,FolderName,"\")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"\")
		wend
		FbdnSym=Instr(1,FolderName,"|")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"|")
		wend
		
		FbdnSym=Instr(1,FolderName,"?")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"?")
		wend
		
		FbdnSym=Instr(1,FolderName,"*")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"*")
		wend
		
		FbdnSym=Instr(1,FolderName,":")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"-"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,":")
		wend
		
		FbdnSym=Instr(1,FolderName,">")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,">")
		wend
		
		FbdnSym=Instr(1,FolderName,"<")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"<")
		wend
		
		FbdnSym=Instr(1,FolderName,"""")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"'"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName,"""")
		wend
		FbdnSym=Instr(1,FolderName," ")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"_"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(1,FolderName," ")
		wend
		FileNameNew=FolderName
		
		NewPath=NewPath+"\"+FileNameNew
		AllPathsNew=AllPathsNew+NewPath
		FolderName=AllPathsNew
		FbdnSym=Instr(1,FolderName,"'")
		While FbdnSym>0
			FolderName=Mid(FolderName,1,FbdnSym-1)+"''"+Mid(FolderName,FbdnSym+1,len(FolderName)-FbdnSym)
			FbdnSym=Instr(FbdnSym+2,FolderName,"'")
		wend
		AllPathsNew=FolderName
		Cmd.CommandText = "Update films set NewPath='"+AllPathsNew+"' where movienum="+cstr(MovieNum)
		Cmd.Execute
		if 	CurrentPath<>NewPath then
			if fso.FileExists(CurrentPath) then
				set CurrentFile=fso.GetFile(CurrentPath)
				CurrentFile.Move NewPath
			else
				msgbox "Файл "+CurrentPath+" не найден"
			end if	
		END IF
		
		
		QueryResult.MoveNext
	Wend
		
	
'		msgbox AllPathsNew
Для работы нужен Access. Детали, если и правда кому понадобится напишу, а так... действительно несколько гиморный способ, но рабочий.