Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Вариант для переименования одного файла, прикрутить пакетную обработку, думаю, несложно будет
Скрытый текст
Код: Выделить весь код
Local Const $APP_NAME = "fb2renamer"
Local Const $APP_VERSION = "0.1"
Local Const $APP_TITLE = $APP_NAME & " v" & $APP_VERSION

Local $g_oXML

Main()


Func _ReadXMLNodeText($oXMLobj, $sNode)
	Local $result = $oXMLobj.SelectSingleNode($sNode)
	If IsObj($result) Then
		Return $result.text
	Else
		Return ""
	EndIf
EndFunc   ;==>_ReadXMLNodeText


Func _ReadXMLNodeAttrib($oXMLobj, $sNode, $sAttrib)
	Local $sXPath = $sNode & "[@" & $sAttrib & "]"
	Local $result = $oXMLobj.SelectSingleNode($sXPath)
	If IsObj($result) Then
		Return $result.getAttribute($sAttrib)
	Else
		Return ""
	EndIf
EndFunc   ;==>_ReadXMLNodeAttrib


Func _GetParentDir($sFileName)
	Return StringLeft($sFileName, StringInStr($sFileName, "\", 0, -1) - 1)
EndFunc   ;==>_GetParentDir


Func _GetFileName($sFileName)
	Return StringTrimLeft($sFileName, StringInStr($sFileName, "\", 0, -1))
EndFunc   ;==>_GetFileName


Func _GetNewName($sFile)
	If $g_oXML.load($sFile) Then
		Local $result
		Local $sLastName, $sMiddleName, $sFirstName, $sBookTitle, $sSequenseName, $sSequenseNumber, $sDate
		
		Local $oNode = $g_oXML.SelectSingleNode("//FictionBook/description/title-info")
		
		$sLastName = _ReadXMLNodeText($oNode, "author/last-name")
		$sMiddleName = _ReadXMLNodeText($oNode, "author/middde-name")
		$sFirstName = _ReadXMLNodeText($oNode, "author/first-name")
		$sBookTitle = _ReadXMLNodeText($oNode, "book-title")
		
		$sSequenseName = _ReadXMLNodeAttrib($oNode, "sequence", "name")
		$sSequenseNumber = _ReadXMLNodeAttrib($oNode, "sequence", "number")
		
		$sDate = _ReadXMLNodeAttrib($oNode, "date", "value")
		If $sDate == "" Then
			$oNode = $g_oXML.SelectSingleNode("//FictionBook/description/document-info")
			$sDate = _ReadXMLNodeAttrib($oNode, "date", "value")
		EndIf
		
		; Новое имя файла:
		Local $sNewFileName = "" _
				 & $sLastName & " " _
				 & $sFirstName & " " _
				 & $sMiddleName & " - " _
				 & $sSequenseName & " " _
				 & ($sSequenseNumber <> "" ? "(" & $sSequenseNumber & ")" : "") & " " _
				 & $sDate & " - " _
				 & $sBookTitle _
				 & ".fb2"
		$sNewFileName = StringRegExpReplace($sNewFileName, "\ +", " ")
		$sNewFileName = StringReplace($sNewFileName, " - - ", " - ")
		
		Return $sNewFileName
	Else
		SetError(1)  ; 1 == file not found
		Return ""
	EndIf
EndFunc   ;==>_GetNewName


Func _DisplayHelp()
	MsgBox(0, $APP_TITLE, "" _
			 & @ScriptName & " [ -y ] FILE1 FILE2 ... FILE(n)" & @CRLF _
			 & @CRLF _
			 & @TAB & "-y" & @TAB & "Переименовать файлы вместо тестирования" & @CRLF _
			)
	Exit 0
EndFunc   ;==>_DisplayHelp


Func _PickUpNewName($sFileName)
	Local $sNewName = $sFileName
	Local $iCount = 1
	While True
		If FileExists($sNewName) Then
			$sNewName = StringRegExpReplace($sNewName, " \([0-9]+\).fb2", " \(" & $iCount & "\).fb2")
			If @extended = 0 Then $sNewName = StringReplace($sNewName, ".fb2", " (" & $iCount & ").fb2")
		Else
			ExitLoop
		EndIf
		$iCount += 1
	WEnd
	Return $sNewName
EndFunc   ;==>_PickUpNewName


Func _RenameSingleFile($bTestMode, $sFileName)
	Local $sOldFullName = FileGetLongName($sFileName, 1)
	Local $sOldFileName = _GetFileName($sOldFullName)
	Local $sFolderName = _GetParentDir($sOldFullName)
	Local $sNewFileName = _GetNewName($sOldFullName)
	Local $sNewFullName = _PickUpNewName($sFolderName & "\" & $sNewFileName)
	$sNewFileName = _GetFileName($sNewFullName)
	
	If $bTestMode Then
		Local $iBtn = MsgBox(4, $APP_TITLE, "" _
				 & "Папка:    " & @CRLF _
				 & $sFolderName & @CRLF & @CRLF _
				 & "Имя книги:" & @CRLF _
				 & $sOldFileName & @CRLF & @CRLF _
				 & "Новое имя: " & @CRLF _
				 & $sNewFileName & @CRLF & @CRLF _
				 & @CRLF _
				 & "Переименовать?" _
				)
		If $iBtn = 6 Then FileMove($sOldFullName, $sNewFullName)
	Else
		FileMove($sOldFullName, $sNewFullName)
	EndIf
EndFunc   ;==>_RenameSingleFile


Func _QuitWithMessage($sMessage, $iMsgBoxCode = 0, $iExitCode = 0)
	MsgBox($iMsgBoxCode, $APP_TITLE, $sMessage)
	Exit $iExitCode
EndFunc   ;==>_QuitWithMessage


Func Main()
	$g_oXML = ObjCreate("Microsoft.XMLDOM")

	If Not IsObj($g_oXML) Then _QuitWithMessage("Ошибка инициализации XML :(", 16, 1)
	
	Local $bOptTestMode = True
	
	If $CmdLine[0] = 0 Then _DisplayHelp()
	
	For $i = 1 To $CmdLine[0]
		Select
			Case $CmdLine[$i] = "/?"
				_DisplayHelp()
				
			Case $CmdLine[$i] = "-y"
				$bOptTestMode = False
				
			Case FileExists($CmdLine[$i])
				_RenameSingleFile($bOptTestMode, $CmdLine[$i])
				
		EndSelect
	Next
EndFunc   ;==>Main
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:31, 07-11-2019 | #6