Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Открытия файлов из скрипта при странном русском имени. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Открытия файлов из скрипта при странном русском имени.
bmv98rus Дата: Четверг, 16.02.2017, 17:14 | Сообщение № 1
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4120
Репутация: 769 ±
Замечаний: 0% ±

Excel 2013/2016
Чтоб не повторять начало тут
Все вроде продумано, все отлажено и ...

На ресурсе оказалось достаточное количество файлов с кривыми наименованиями, от нименовани каталога
"2016.10 - Задачи СРМ в горизонте 5 лет Барышников В" до безобидного на первый взгляд файла "Новые драйвера .pptx". Но "й" там на самом дел "й" и как бы не пытался в скрипте открыть - не выходит. Dir, Scripting.FileSystemObject, Shell.Application - результат одинаков. 8dot3 имена на файловом сервер отключены.

Понятно что в кодировке дело, но как это обойти в скрипте? Обычным образом файл естесвенно открыватся.
К сообщению приложен файл: 5007333.pptx (41.8 Kb)


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеЧтоб не повторять начало тут
Все вроде продумано, все отлажено и ...

На ресурсе оказалось достаточное количество файлов с кривыми наименованиями, от нименовани каталога
"2016.10 - Задачи СРМ в горизонте 5 лет Барышников В" до безобидного на первый взгляд файла "Новые драйвера .pptx". Но "й" там на самом дел "й" и как бы не пытался в скрипте открыть - не выходит. Dir, Scripting.FileSystemObject, Shell.Application - результат одинаков. 8dot3 имена на файловом сервер отключены.

Понятно что в кодировке дело, но как это обойти в скрипте? Обычным образом файл естесвенно открыватся.

Автор - bmv98rus
Дата добавления - 16.02.2017 в 17:14
_Boroda_ Дата: Четверг, 16.02.2017, 18:02 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16734
Репутация: 6534 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Михаил, а если открывать файлы не по наименованию, а по индексу? 1-2-3-...


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеМихаил, а если открывать файлы не по наименованию, а по индексу? 1-2-3-...

Автор - _Boroda_
Дата добавления - 16.02.2017 в 18:02
bmv98rus Дата: Четверг, 16.02.2017, 19:10 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4120
Репутация: 769 ±
Замечаний: 0% ±

Excel 2013/2016
Алексанр,

Немного поподробнее о индексе , или я не понял/не знаю или ...
мне файл надо открыть как объект для дальнейшей обработки.
[vba]
Код
Set objPresentation = Application.Presentations.Open(FilePath, msoFalse, msoFalse, msoFalse)
[/vba]
Что мне в FilePath передать?. Это первая часть,
а слеудющая, предположу что при обходе дерева каталогов может случится аналогичное, но уже в имени папки. В предыдущей версии взял ShortName и на локалке все прокатило + как бонус получил возможность углубится на несолько уровней дальше. По доинному пути доходит до ограничений в 259 символов, только пользователи об этом не знают. Но как написал выше короткие имена отстутвуют (к слову Win server 2012 имеет такую настройку по умалчанию).
Ну допустим длинну я обойду мапированем на технологическую литеру при достижении длнны более чем X символов, но если там будет снова такой непечатный символ, то снова его не сожрет PowerPoint.

P.S. задача разовая, но вайловая структура очень большая и боюсь по логу потом руками будет много чего править, а хочется максимально сделать автоматом.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеАлексанр,

Немного поподробнее о индексе , или я не понял/не знаю или ...
мне файл надо открыть как объект для дальнейшей обработки.
[vba]
Код
Set objPresentation = Application.Presentations.Open(FilePath, msoFalse, msoFalse, msoFalse)
[/vba]
Что мне в FilePath передать?. Это первая часть,
а слеудющая, предположу что при обходе дерева каталогов может случится аналогичное, но уже в имени папки. В предыдущей версии взял ShortName и на локалке все прокатило + как бонус получил возможность углубится на несолько уровней дальше. По доинному пути доходит до ограничений в 259 символов, только пользователи об этом не знают. Но как написал выше короткие имена отстутвуют (к слову Win server 2012 имеет такую настройку по умалчанию).
Ну допустим длинну я обойду мапированем на технологическую литеру при достижении длнны более чем X символов, но если там будет снова такой непечатный символ, то снова его не сожрет PowerPoint.

P.S. задача разовая, но вайловая структура очень большая и боюсь по логу потом руками будет много чего править, а хочется максимально сделать автоматом.

Автор - bmv98rus
Дата добавления - 16.02.2017 в 19:10
anvg Дата: Четверг, 16.02.2017, 23:21 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
У меня не первом нестандартном имени таким кодом отработало из 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 - Пятница, 17.02.2017, 06:29
 
Ответить
СообщениеДоброе время суток.
У меня не первом нестандартном имени таким кодом отработало из 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
Дата добавления - 16.02.2017 в 23:21
bmv98rus Дата: Пятница, 17.02.2017, 08:14 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4120
Репутация: 769 ±
Замечаний: 0% ±

Excel 2013/2016
Андрей,

В очередной раз спасибо, но не то и на половину я виноват, я не заметил что имя в аттаче сменилось. Приложил архив с примером проблемного файла.
К сообщению приложен файл: 1694753.zip (32.4 Kb)


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Пятница, 17.02.2017, 08:14
 
Ответить
СообщениеАндрей,

В очередной раз спасибо, но не то и на половину я виноват, я не заметил что имя в аттаче сменилось. Приложил архив с примером проблемного файла.

Автор - bmv98rus
Дата добавления - 17.02.2017 в 08:14
anvg Дата: Пятница, 17.02.2017, 09:22 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Странно, Михаил. Специально положил поглубже на сервере (версию не скажу - нет прав), дополнил код вывода (Office 2010 32bit)
[vba]
Код
            Debug.Print pItem.BuiltinDocumentProperties(1)
            Debug.Print pItem.BuiltinDocumentProperties(3)
            Debug.Print pItem.BuiltinDocumentProperties(7)
[/vba]
Результат в Immediate
Цитата
\\ServerName\Share\OwnerName\SQL_Server2014DE_SP2_RU_x64_dvd_8967675\Под папка 1\Под папка 2\Под папка 3\Под папка 4\Новые драи?вера.pptx объектов на 1-ом слайде 0
О внесении изменений в архитектуру корпоративных процессов
Фамилия Имя Отчество
Фамилия Имя Отчество

P. S. Реальные ФИО убрал.
 
Ответить
СообщениеСтранно, Михаил. Специально положил поглубже на сервере (версию не скажу - нет прав), дополнил код вывода (Office 2010 32bit)
[vba]
Код
            Debug.Print pItem.BuiltinDocumentProperties(1)
            Debug.Print pItem.BuiltinDocumentProperties(3)
            Debug.Print pItem.BuiltinDocumentProperties(7)
[/vba]
Результат в Immediate
Цитата
\\ServerName\Share\OwnerName\SQL_Server2014DE_SP2_RU_x64_dvd_8967675\Под папка 1\Под папка 2\Под папка 3\Под папка 4\Новые драи?вера.pptx объектов на 1-ом слайде 0
О внесении изменений в архитектуру корпоративных процессов
Фамилия Имя Отчество
Фамилия Имя Отчество

P. S. Реальные ФИО убрал.

Автор - anvg
Дата добавления - 17.02.2017 в 09:22
_Boroda_ Дата: Пятница, 17.02.2017, 09:23 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 16734
Репутация: 6534 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Немного поподробнее о индексе , или я не понял/не знаю или ...

Вполне возможно, что это я чего-то не понял. Я исходил из этих слов первого поста предыдущей темы
при пакетной обработке скриптом.
и предположил, что все это безобразие лежит в одной или нескольких папках, заранее известных. Тогда можно просто подряд открывать файлы в этой папке, не запрашивая их (файлов) имени. Просто первый-второй-третий...
Первое, что в наяндексил - http://www.cyberforum.ru/post2732074.html


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Немного поподробнее о индексе , или я не понял/не знаю или ...

Вполне возможно, что это я чего-то не понял. Я исходил из этих слов первого поста предыдущей темы
при пакетной обработке скриптом.
и предположил, что все это безобразие лежит в одной или нескольких папках, заранее известных. Тогда можно просто подряд открывать файлы в этой папке, не запрашивая их (файлов) имени. Просто первый-второй-третий...
Первое, что в наяндексил - http://www.cyberforum.ru/post2732074.html

Автор - _Boroda_
Дата добавления - 17.02.2017 в 09:23
bmv98rus Дата: Пятница, 17.02.2017, 10:27 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4120
Репутация: 769 ±
Замечаний: 0% ±

Excel 2013/2016
Андрей, Александр,

Спасибо, навели на пути решения.

Александр, там обход дерева по весомой файловой структуре, в той теме писал про количество. На само деле три точки входа, в одной более 8000K файлов и из них 8K презентаций. Все подлжат проверке и обработке :-(

Андрей, я для фильтрации использовал Shell.Application и он то вредил. Из-за общего количества перебор по расширению через FSO долгим был, приладил фильтр и на нем сгорел :-). Объеденю два решения. если фильтр Shell.Application вернет не пустышку то переберу через FSO. Или попробую вариант Александра приладить. только боюсь там будут проблемы из-за самого PowePoint.
Александр, FileSearch не работает на 2010 и выше :-(.


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Пятница, 17.02.2017, 11:12
 
Ответить
СообщениеАндрей, Александр,

Спасибо, навели на пути решения.

Александр, там обход дерева по весомой файловой структуре, в той теме писал про количество. На само деле три точки входа, в одной более 8000K файлов и из них 8K презентаций. Все подлжат проверке и обработке :-(

Андрей, я для фильтрации использовал Shell.Application и он то вредил. Из-за общего количества перебор по расширению через FSO долгим был, приладил фильтр и на нем сгорел :-). Объеденю два решения. если фильтр Shell.Application вернет не пустышку то переберу через FSO. Или попробую вариант Александра приладить. только боюсь там будут проблемы из-за самого PowePoint.
Александр, FileSearch не работает на 2010 и выше :-(.

Автор - bmv98rus
Дата добавления - 17.02.2017 в 10:27
anvg Дата: Пятница, 17.02.2017, 11:16 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
я для фильтрации использовал 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
[/vba]
 
Ответить
Сообщение
я для фильтрации использовал 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
[/vba]

Автор - anvg
Дата добавления - 17.02.2017 в 11:16
bmv98rus Дата: Пятница, 17.02.2017, 12:54 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4120
Репутация: 769 ±
Замечаний: 0% ±

Excel 2013/2016
С этим то все ок, только далее
[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
[/vba] и File.Path возвращал кривое имя.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеС этим то все ок, только далее
[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
[/vba] и File.Path возвращал кривое имя.

Автор - bmv98rus
Дата добавления - 17.02.2017 в 12:54
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!