Чтоб не повторять начало тут Все вроде продумано, все отлажено и ...
На ресурсе оказалось достаточное количество файлов с кривыми наименованиями, от нименовани каталога "2016.10 - Задачи СРМ в горизонте 5 лет → Барышников В" до безобидного на первый взгляд файла "Новые драйвера .pptx". Но "й" там на самом дел "й" и как бы не пытался в скрипте открыть - не выходит. Dir, Scripting.FileSystemObject, Shell.Application - результат одинаков. 8dot3 имена на файловом сервер отключены.
Понятно что в кодировке дело, но как это обойти в скрипте? Обычным образом файл естесвенно открыватся.
Чтоб не повторять начало тут Все вроде продумано, все отлажено и ...
На ресурсе оказалось достаточное количество файлов с кривыми наименованиями, от нименовани каталога "2016.10 - Задачи СРМ в горизонте 5 лет → Барышников В" до безобидного на первый взгляд файла "Новые драйвера .pptx". Но "й" там на самом дел "й" и как бы не пытался в скрипте открыть - не выходит. Dir, Scripting.FileSystemObject, Shell.Application - результат одинаков. 8dot3 имена на файловом сервер отключены.
Понятно что в кодировке дело, но как это обойти в скрипте? Обычным образом файл естесвенно открыватся.bmv98rus
Немного поподробнее о индексе , или я не понял/не знаю или ... мне файл надо открыть как объект для дальнейшей обработки. [vba]
Код
Set objPresentation = Application.Presentations.Open(FilePath, msoFalse, msoFalse, msoFalse)
[/vba] Что мне в FilePath передать?. Это первая часть, а слеудющая, предположу что при обходе дерева каталогов может случится аналогичное, но уже в имени папки. В предыдущей версии взял ShortName и на локалке все прокатило + как бонус получил возможность углубится на несолько уровней дальше. По доинному пути доходит до ограничений в 259 символов, только пользователи об этом не знают. Но как написал выше короткие имена отстутвуют (к слову Win server 2012 имеет такую настройку по умалчанию). Ну допустим длинну я обойду мапированем на технологическую литеру при достижении длнны более чем X символов, но если там будет снова такой непечатный символ, то снова его не сожрет PowerPoint.
P.S. задача разовая, но вайловая структура очень большая и боюсь по логу потом руками будет много чего править, а хочется максимально сделать автоматом.
Алексанр,
Немного поподробнее о индексе , или я не понял/не знаю или ... мне файл надо открыть как объект для дальнейшей обработки. [vba]
Код
Set objPresentation = Application.Presentations.Open(FilePath, msoFalse, msoFalse, msoFalse)
[/vba] Что мне в FilePath передать?. Это первая часть, а слеудющая, предположу что при обходе дерева каталогов может случится аналогичное, но уже в имени папки. В предыдущей версии взял ShortName и на локалке все прокатило + как бонус получил возможность углубится на несолько уровней дальше. По доинному пути доходит до ограничений в 259 символов, только пользователи об этом не знают. Но как написал выше короткие имена отстутвуют (к слову Win server 2012 имеет такую настройку по умалчанию). Ну допустим длинну я обойду мапированем на технологическую литеру при достижении длнны более чем X символов, но если там будет снова такой непечатный символ, то снова его не сожрет PowerPoint.
P.S. задача разовая, но вайловая структура очень большая и боюсь по логу потом руками будет много чего править, а хочется максимально сделать автоматом.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Доброе время суток. У меня не первом нестандартном имени таким кодом отработало из Excel. Естественно, что задать параметры только для чтения так не получится. В параметрах командной строки таковых нет, увы. Возможно, стоит или набросать код в C# или через PowerShell отработать. [vba]
Код
Public Sub test() Dim fso As Object, pFolder As Object, pFile As Object Dim ppt As Object, pShell As Object Set fso = CreateObject("Scripting.FileSystemObject") Set pFolder = fso.GetFolder("c:\1") Set ppt = CreateObject("Powerpoint.Application") Set pShell = CreateObject("WScript.Shell") ppt.Visible = True For Each pFile In pFolder.Files If LCase$(fso.GetExtensionName(pFile.Name)) = "pptx" Then 'ppt.Presentations.Open """" & fso.GetAbsolutePathName(pFile.Path) & """", msoFalse, msoFalse, msoFalse pShell.Run """" & fso.GetAbsolutePathName(pFile.Path) & """" Debug.Print ppt.Presentations.Count End If Next End Sub
[/vba] P. S. Чтобы ppt-объект был связан с открытым файлом необходимо чтобы на момент запуска макроса Powerpoint не был бы открыт. Updated Отработал и стандартный вариант, только презентация открывается в скрытом окне - может так и надо? Тем не менее, объект презентации реагирует на обращения к методам и коллекциям. [vba]
Код
Public Sub test() Dim fso As Object, pFolder As Object, pFile As Object Dim ppt As Object, pShell As Object, pItem As Object Set fso = CreateObject("Scripting.FileSystemObject") Set pFolder = fso.GetFolder("c:\1") Set ppt = CreateObject("Powerpoint.Application") Set pShell = CreateObject("WScript.Shell") ppt.Visible = True For Each pFile In pFolder.Files If LCase$(fso.GetExtensionName(pFile.Name)) = "pptx" Then Set pItem = ppt.Presentations.Open(pFile.Path, msoFalse, msoFalse, msoFalse) 'pShell.Run """" & fso.GetAbsolutePathName(pFile.Path) & """" Debug.Print pItem.FullName & " объектов на 1-ом слайде " & pItem.Slides(1).Shapes.Count End If Next End Sub
[/vba] Имя файла "c:\1\2016.10 - Задачи СРМ в горизонте 5 лет → Барышников В.pptx"
Доброе время суток. У меня не первом нестандартном имени таким кодом отработало из Excel. Естественно, что задать параметры только для чтения так не получится. В параметрах командной строки таковых нет, увы. Возможно, стоит или набросать код в C# или через PowerShell отработать. [vba]
Код
Public Sub test() Dim fso As Object, pFolder As Object, pFile As Object Dim ppt As Object, pShell As Object Set fso = CreateObject("Scripting.FileSystemObject") Set pFolder = fso.GetFolder("c:\1") Set ppt = CreateObject("Powerpoint.Application") Set pShell = CreateObject("WScript.Shell") ppt.Visible = True For Each pFile In pFolder.Files If LCase$(fso.GetExtensionName(pFile.Name)) = "pptx" Then 'ppt.Presentations.Open """" & fso.GetAbsolutePathName(pFile.Path) & """", msoFalse, msoFalse, msoFalse pShell.Run """" & fso.GetAbsolutePathName(pFile.Path) & """" Debug.Print ppt.Presentations.Count End If Next End Sub
[/vba] P. S. Чтобы ppt-объект был связан с открытым файлом необходимо чтобы на момент запуска макроса Powerpoint не был бы открыт. Updated Отработал и стандартный вариант, только презентация открывается в скрытом окне - может так и надо? Тем не менее, объект презентации реагирует на обращения к методам и коллекциям. [vba]
Код
Public Sub test() Dim fso As Object, pFolder As Object, pFile As Object Dim ppt As Object, pShell As Object, pItem As Object Set fso = CreateObject("Scripting.FileSystemObject") Set pFolder = fso.GetFolder("c:\1") Set ppt = CreateObject("Powerpoint.Application") Set pShell = CreateObject("WScript.Shell") ppt.Visible = True For Each pFile In pFolder.Files If LCase$(fso.GetExtensionName(pFile.Name)) = "pptx" Then Set pItem = ppt.Presentations.Open(pFile.Path, msoFalse, msoFalse, msoFalse) 'pShell.Run """" & fso.GetAbsolutePathName(pFile.Path) & """" Debug.Print pItem.FullName & " объектов на 1-ом слайде " & pItem.Slides(1).Shapes.Count End If Next End Sub
[/vba] Имя файла "c:\1\2016.10 - Задачи СРМ в горизонте 5 лет → Барышников В.pptx"anvg
Сообщение отредактировал anvg - Пятница, 17.02.2017, 06:29
В очередной раз спасибо, но не то и на половину я виноват, я не заметил что имя в аттаче сменилось. Приложил архив с примером проблемного файла.
Андрей,
В очередной раз спасибо, но не то и на половину я виноват, я не заметил что имя в аттаче сменилось. Приложил архив с примером проблемного файла.bmv98rus
\\ServerName\Share\OwnerName\SQL_Server2014DE_SP2_RU_x64_dvd_8967675\Под папка 1\Под папка 2\Под папка 3\Под папка 4\Новые драи?вера.pptx объектов на 1-ом слайде 0 О внесении изменений в архитектуру корпоративных процессов Фамилия Имя Отчество Фамилия Имя Отчество
P. S. Реальные ФИО убрал.
Странно, Михаил. Специально положил поглубже на сервере (версию не скажу - нет прав), дополнил код вывода (Office 2010 32bit) [vba]
\\ServerName\Share\OwnerName\SQL_Server2014DE_SP2_RU_x64_dvd_8967675\Под папка 1\Под папка 2\Под папка 3\Под папка 4\Новые драи?вера.pptx объектов на 1-ом слайде 0 О внесении изменений в архитектуру корпоративных процессов Фамилия Имя Отчество Фамилия Имя Отчество
и предположил, что все это безобразие лежит в одной или нескольких папках, заранее известных. Тогда можно просто подряд открывать файлы в этой папке, не запрашивая их (файлов) имени. Просто первый-второй-третий... Первое, что в наяндексил - http://www.cyberforum.ru/post2732074.html
и предположил, что все это безобразие лежит в одной или нескольких папках, заранее известных. Тогда можно просто подряд открывать файлы в этой папке, не запрашивая их (файлов) имени. Просто первый-второй-третий... Первое, что в наяндексил - http://www.cyberforum.ru/post2732074.html_Boroda_
Александр, там обход дерева по весомой файловой структуре, в той теме писал про количество. На само деле три точки входа, в одной более 8000K файлов и из них 8K презентаций. Все подлжат проверке и обработке :-(
Андрей, я для фильтрации использовал Shell.Application и он то вредил. Из-за общего количества перебор по расширению через FSO долгим был, приладил фильтр и на нем сгорел :-). Объеденю два решения. если фильтр Shell.Application вернет не пустышку то переберу через FSO. Или попробую вариант Александра приладить. только боюсь там будут проблемы из-за самого PowePoint. Александр, FileSearch не работает на 2010 и выше :-(.
Андрей, Александр,
Спасибо, навели на пути решения.
Александр, там обход дерева по весомой файловой структуре, в той теме писал про количество. На само деле три точки входа, в одной более 8000K файлов и из них 8K презентаций. Все подлжат проверке и обработке :-(
Андрей, я для фильтрации использовал Shell.Application и он то вредил. Из-за общего количества перебор по расширению через FSO долгим был, приладил фильтр и на нем сгорел :-). Объеденю два решения. если фильтр Shell.Application вернет не пустышку то переберу через FSO. Или попробую вариант Александра приладить. только боюсь там будут проблемы из-за самого PowePoint. Александр, FileSearch не работает на 2010 и выше :-(.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Пятница, 17.02.2017, 11:12
я для фильтрации использовал Shell.Application и он то вредил
Михаил, да он не вредит, просто работает ассинхронно, То есть стоит делать цикл пока меняется количество отобранных данных [vba]
Код
Public Sub Test() Dim pptxFiles As Shell32.FolderItems3 Dim pShell As New Shell32.Shell Dim prevCount As Long Set pptxFiles = pShell.Namespace("D:\Path").Items pptxFiles.Filter &H40, "*.pptx" prevCount = 0 Do Until prevCount = pptxFiles.Count prevCount = pptxFiles.Count ' возможно стоит воткнуть некоторое ожидание Loop Debug.Print prevCount End Sub
я для фильтрации использовал Shell.Application и он то вредил
Михаил, да он не вредит, просто работает ассинхронно, То есть стоит делать цикл пока меняется количество отобранных данных [vba]
Код
Public Sub Test() Dim pptxFiles As Shell32.FolderItems3 Dim pShell As New Shell32.Shell Dim prevCount As Long Set pptxFiles = pShell.Namespace("D:\Path").Items pptxFiles.Filter &H40, "*.pptx" prevCount = 0 Do Until prevCount = pptxFiles.Count prevCount = pptxFiles.Count ' возможно стоит воткнуть некоторое ожидание Loop Debug.Print prevCount End Sub
Set objFolder = objShellApp.NameSpace(Folder.Path) Set objFolderItems = objFolder.items() objFolderItems.Filter 64 + 128, "*.pptx;*.ppt;*.pptm;*.ppsx;*.pps;*.ppsm;*.potx;*.pot;*.potm" For Each File In objFolderItems File.Path ...... next
[/vba] и File.Path возвращал кривое имя.
С этим то все ок, только далее [vba]
Код
Set objFolder = objShellApp.NameSpace(Folder.Path) Set objFolderItems = objFolder.items() objFolderItems.Filter 64 + 128, "*.pptx;*.ppt;*.pptm;*.ppsx;*.pps;*.ppsm;*.potx;*.pot;*.potm" For Each File In objFolderItems File.Path ...... next