vcomp71
Осваивающий
- Сообщения
- 431
- Репутация
- 25
Написал я тут скрипт, который формирует bat файл для кодирования списка файлов, с помощью Windows Media. Смысл в том, что в командной сроке этот кодировщик отказывается понимать русские имена файлов, в результате пришлось кодировать все вместо исходной папки в некую папку временную с английскими названиями. Если для файла, который является источником вывернуться удалось, с помощью функции вызывающей кроткое имя файла, то вот с конченным файлом - ну никак! Есть какие-нибудь идеи,как это обойти?
Код:
;Формируем строку команд
#include <Array.au3>
#include <file.au3>
#include <GUIConstants.au3>
dim $files[1]
dim $A[1]
dim $i=0
dim $filesName[1]
Dim $szDrive, $szDir, $szFName, $szExt
global $bb = 'c:\Program Files\Windows Media Components\Encoder\zap.bat'
global $temp='c:\Video\temp\'
global $sp = 'c:\Program Files\Windows Media Components\Encoder\'
#Region ### START Koda GUI section ### Form=C:\proekt\Кодирование\form\Form1.kxf
$Form1 = GUICreate("Кодирование фафлов в архив", 422, 372, 217, 125)
$Button1 = GUICtrlCreateButton("Обзор", 296, 32, 105, 25, 0)
$Input1 = GUICtrlCreateInput("", 16, 32, 265, 21)
$Label1 = GUICtrlCreateLabel("Директория", 16, 8, 66, 17)
$Group1 = GUICtrlCreateGroup("Тип экрана", 16, 64, 385, 57)
$Radio1 = GUICtrlCreateRadio("Широкоэкранный", 32, 88, 105, 17)
GUICtrlSetState($Radio1, $GUI_CHECKED)
$Radio2 = GUICtrlCreateRadio("Квадратный", 264, 80, 121, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label2 = GUICtrlCreateLabel("Файлы для кодирования", 16, 125, 166, 122)
$List1 = GUICtrlCreateList("", 16, 140, 385, 201)
$knOK = GUICtrlCreateButton("ОК", 16, 345, 113, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$var = _Vibordir()
if $var <>"" Then
GUICtrlSetData ($Input1,$var)
_FileListR($files, $i, $var)
$var=_ArrayToString($files)
GUICtrlSetData ($List1,$var)
;GUIDelete()
endif
Case $knOK
$var=GUICtrlRead($radio1)
$pp = GUICtrlRead($Input1)
if $var=1 Then
_kod($pp,2)
Else
_kod($pp,1)
EndIf
EndSwitch
WEnd
func _Vibordir()
$path = FileSelectFolder('Выбираем директорию',"")
If $path="" Then
msgbox(0,'Кодировщик файлов','Директория не выбрана')
Return ""
Else
Return $path
EndIf
EndFunc
func _Kod($path,$metod)
ReDim $filesName[UBound($files)]
;Формируем батник
if FileExists($bb) then FileDelete($bb)
$fi = FileOpen($bb, 2)
for $i=0 to UBound($files)-1
;переименовываем
$filesName[$i]=$i&'.avi'
$ss =_Stroka($files[$i],$filesName[$i],$metod)
FileWriteLine($fi, $ss)
Next
FileClose($fi)
MsgBox(0, "Начинаем кодирование", $var)
FileChangeDir($sp)
$var= ShellExecuteWait($bb)
MsgBox(0, "Кодирование закончено", $var)
for $i=0 to UBound($files)-1
$TP = _PathSplit($files[$i], $szDrive, $szDir, $szFName, $szExt)
FileMove($temp&$filesName[$i], $szDrive&$szDir&$szFName&'.wmv')
Next
EndFunc
Func _FileListR(ByRef $rArray, ByRef $cNumber, $ParentDir, $SearchDir = $ParentDir)
FileChangeDir($SearchDir) ; Переходим в каталог для поиска
Local $sHandle = FileFindFirstFile("*") ; Инициализируем поиск
While 1
If $sHandle = -1 Then ; Если каталог пуст изначально - закрываем хэндл и прекращаем поиск
FileClose($sHandle)
ExitLoop
EndIf
$rArray[$cNumber] = @WorkingDir & "\" & FileFindNextFile($sHandle) ; Иначе заносим в массив полный путь к найденному элементу
If @error Then ; Если файлы/каталоги закончились - закрываеи хэндл и прекращаем поиск
FileClose($sHandle)
ExitLoop
EndIf
$cNumber += 1 ; Иначе переходм к следующему элементу массива
If $cNumber >= UBound($rArray) Then ReDim $rArray[2*$cNumber] ; Если место в массиве закончилось - удваиваем его размер
If StringInStr(FileGetAttrib($rArray[$cNumber-1]), "D") Then _FileListR($rArray, $cNumber, @WorkingDir, $A[$cNumber-1]) ; Если найденное - каталог, то продолжаем поиск в нём.
WEnd
FileChangeDir($ParentDir) ; Переходим в родительский каталог
If $ParentDir = $SearchDir Then ReDim $rArray[$I] ; Если родительский каталог = каталог для поиска (поиск закончен) - уменьшаем размер массива до необходимого
EndFunc
func _Stroka($fullname,$zamena,$format)
Dim $szDrive, $szDir, $szFName, $szExt
$TestPath = _PathSplit($fullname, $szDrive, $szDir, $szFName, $szExt)
$name= FileGetShortName($fullname)
$d = $szDrive&$szDir
$s = 'cscript.exe wmcmd.vbs -input '
$s =$s&$name
$s =$s&' -output '
;Формируем файл архива
$s1 =$temp&$zamena&'.wmv'
$s =$s&$s1
$s =$s&' -loadprofile '
$s =$s&'c:\Video\Formats\form_'&$format&'.wme '
return $s
EndFunc