Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   doc в docx (http://forum.oszone.net/showthread.php?t=327248)

Sisin 01-06-2017 12:26 2741315

doc в docx
 
Существует ли возможность командой для Microsoft Word конвертировать doc в docx?

Цель - Сделать bat-файл, помещая который в папку, все файлы doc, находящиеся в папке, конвертировались бы в в docx с удалением исходных doc в корзину.
Необходимость - Файлы docx занимают заметно меньше места.

Iska 01-06-2017 14:02 2741331

Цитата:

Цитата Sisin
Существует ли возможность командой для Microsoft Word конвертировать doc в docx? »

Нет. Но можно попробовать сделать скрипт. Какой версии Office?

Цитата:

Цитата Sisin
Необходимость - Файлы docx занимают заметно меньше места. »

Это сильно зависит от содержимого и используемого форматирования. Если это единственная цель — то лучше не стоит.

Sisin 01-06-2017 14:38 2741344

Цитата:

Цитата Iska
Какой версии Office? »

2010.

Цитата:

Цитата Iska
Это сильно зависит от содержимого и используемого форматирования. Если это единственная цель — то лучше не стоит. »

В моем случае стоит. Одну папку вручную переделал 220 Мб -> 23 Мб. Большинство документов однотипные.

greg zakharov 01-06-2017 15:04 2741349

Sisin, doc и docx - принципиально разные форматы. docx - это zip-архив, содержащий файлы стилей, содержимого и так далее, представленные xml-файлами, в то время как doc - не является архивом; это бинарный файл с довольно-таки сложной структурой данных, разобрать которую на "голом" командном языке представляется возможным только в теории. А вот гибридная техника - CMD+WSH - вполне может сослужить службу конвертера doc в docx посредством COM, насколько помню, Word.Application.

yurfed 01-06-2017 15:35 2741362

Цитата:

Цитата Iska
Это сильно зависит от содержимого и используемого форматирования. »

Да это так, но попробуйте сохранить *.docx в ZIP, RAR по расширению и тд. Вы там увидите кучу xml файликов и прочего мусора. Это окажется обычный архив.
Вот и думайте сами, архивировать свою нужду или оставить всё, как оно есть.

megaloman 01-06-2017 22:10 2741463

Sisin,
Тупо написал VBS-скрипт с макросом для Word. Особенно не "вылизывал", если среди Doc есть увечные файлы, возможны проблемы
Код:

BoxIn = "Z:\Box_In"
BoxOut = "Z:\Box_Out"

Set RegMaska = New RegExp
RegMaska.Pattern = "^.*\.doc$"
RegMaska.IgnoreCase = True

Set FSO = CreateObject("Scripting.FileSystemObject")

Set Folds = FSO.GetFolder(BoxIn)
Set Files = Folds.Files
       
Set WD = CreateObject("Word.Application")

With WD

  .Visible = True

  For Each jF In Files
        If RegMaska.Test(jF) Then
            FileIn = BoxIn + "\" + FSO.GetBaseName(jF) + ".doc"
            FileOut = BoxOut + "\" + FSO.GetBaseName(jF) + ".docx"
            If Not FSO.FileExists(FileOut) Then
                Call .Documents.Open(FileIn, False, False, False, "", "", False, "", "", 0, "")
                Call .ActiveDocument.SaveAs2(FileOut, 12, False, "", True, "", False, False, False, False, False, , , , , , 14)
                .ActiveWindow.Close
                If FSO.FileExists(FileOut) Then FSO.DeleteFile (FileIn)
            Else
                MsgBox "Файл" + vbCrLf + FileOut + vbCrLf + "Уже существует" + vbCrLf + vbCrLf + "поэтому файл" + vbCrLf + FileIn + vbCrLf + "Не преобразовываем"
            End If
        End If
  Next
  .Quit

End With

Пропишите свои пути для папок. Входная и выходная папки могут совпадать.

Sisin 02-06-2017 11:40 2741553

Цитата:

Цитата megaloman
Пропишите свои пути для папок. Входная и выходная папки могут совпадать. »

Благодарю. А подскажите, пожалуйста, как его сделать, так чтобы скрипт класть в папку с doc, запускать, и все бы doc в папке со скриптом конвертировались в docx с удалением doc?

megaloman 02-06-2017 14:55 2741615

как его сделать, так чтобы скрипт класть в папку с doc, запускать, и все бы doc в папке со скриптом конвертировались в docx с удалением doc
Код:

Set Shell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

Set Arg = WScript.Arguments

If Arg.Count <> 0 Then
        BoxIn = Arg(0)
Else
        BoxIn = Shell.CurrentDirectory
End If

If Right(BoxIn,1) <> "\" Then BoxIn=BoxIn+"\"

If Not FSO.FolderExists(BoxIn) Then
        MsgBox "Папка" + vbCrLf + vbCrLf + BoxIn + vbCrLf + vbCrLf + "не найдена"
        WScript.Quit
End If

BoxOut = BoxIn

Set RegMaska = New RegExp
RegMaska.Pattern = "^.*\.doc$"
RegMaska.IgnoreCase = True

Set Folds = FSO.GetFolder(BoxIn)
Set Files = Folds.Files
       
Set WD = CreateObject("Word.Application")

With WD

  .Visible = True

  For Each jF In Files
        If RegMaska.Test(jF) Then
            FileIn = BoxIn + FSO.GetBaseName(jF) + ".doc"
            FileOut = BoxOut +  FSO.GetBaseName(jF) + ".docx"
            If Not FSO.FileExists(FileOut) Then
                Call .Documents.Open(FileIn, False, False, False, "", "", False, "", "", 0, "")
                Call .ActiveDocument.SaveAs2(FileOut, 12, False, "", True, "", False, False, False, False, False, , , , , , 14)
                .ActiveWindow.Close
                If FSO.FileExists(FileOut) Then FSO.DeleteFile (FileIn)
            Else
                MsgBox "Файл" + vbCrLf + FileOut + vbCrLf + "Уже существует" + vbCrLf + vbCrLf + "поэтому файл" + vbCrLf + FileIn + vbCrLf + "Не преобразовываем"
            End If
        End If
  Next
  .Quit

End With

Этот вариант скрипта также работает, если путь папки передать при вызове скрипта как параметр (если в пути есть пробелы - путь передавать в "кавычках")

Iska 02-06-2017 15:19 2741625

Цитата:

Цитата Sisin
как его сделать, так чтобы скрипт класть в папку с doc, запускать, »

Не делайте так. Это неправильный путь. Правильный путь — передавать путь к папке параметром скрипта. В том числе это подразумевает возможность просто перетащить папку на скрипт в Проводнике.

megaloman 02-06-2017 15:25 2741628

Iska, "В лоб" у меня не получилось: создал на раб столе ярлык на скрипт, пытаюсь затянуть на него папку - попытка копирования.
Получилось по другому: создал ярлык на
C:\Windows\System32\wscript.exe
затем изменил его - добавил параметр - полный путь скрипта
C:\Windows\System32\wscript.exe "Z:\Soft_In\я170602.vbs"
и уже когда затягиваю папку на этот ярлык - всё прекрасно работает.
Может быть можно сделать прямее?

Iska 02-06-2017 15:25 2741629

megaloman, можете посмотреть в своей версии Office в Браузере объектов, остался ли у класса Document метод .Save() (может быть и в скрытых), или же он «deprecate»?

megaloman 02-06-2017 15:33 2741633

Вложений: 1
Iska, Вы этого хотели?

Iska 02-06-2017 15:48 2741641

Ага, спасибо.

Я, балбес, к сожалению, ошибся в методе. Я хотел спросить про старый метод .SaveAs(). Сделайте ПКМ на правом списке Members of… и выберете Show hidden members. Есть он там?

megaloman 02-06-2017 16:02 2741648

Вложений: 1
Смотрите :)
У меня Office 2010

Iska 02-06-2017 22:10 2741730

megaloman, большое спасибо! Таки не совсем deprecate, не совсем… Оставили пока в скрытых :). А .SaveAs2000, видимо, псевдоним к нему, что ли?! Ладно, если у меня когда-нибудь появится Office >=2007 — пощщупаю :).

Iska 03-06-2017 13:10 2741827

Цитата:

Цитата megaloman
Iska, "В лоб" у меня не получилось: создал на раб столе ярлык на скрипт, пытаюсь затянуть на него папку - попытка копирования. »

Создал скрипт .vbs. Создал ярлык на него на Рабочем столе. Перетаскиваю папку из Проводника — скрипту нормально передаётся полный путь к ней. Перетаскивание нескольких папок зараз, ярлык на скрипт не на Рабочем столе — всё работает по-прежнему. Windows 7 x64.

Sisin 05-06-2017 11:13 2742205

Цитата:

Цитата megaloman
Этот вариант скрипта также работает, если путь папки передать при вызове скрипта как параметр (если в пути есть пробелы - путь передавать в "кавычках") »

Господа, этот скрипт работает.

Цитата:

Цитата Iska
Не делайте так. Это неправильный путь. Правильный путь — передавать путь к папке параметром скрипта. В том числе это подразумевает возможность просто перетащить папку на скрипт в Проводнике. »

Эта фраза относится к нему (скрипту)???

Iska 05-06-2017 11:27 2742209

Цитата:

Цитата Sisin
Эта фраза относится к нему (скрипту)??? »

Эта фраза относится к процитированному там. Могу повторить ту цитату (ключевое выделил):
Цитата:

Цитата Sisin
как его сделать, так чтобы скрипт класть в папку с doc, запускать, »


Sisin 05-06-2017 11:47 2742213

Цитата:

Цитата megaloman
Этот вариант скрипта также работает, если путь папки передать при вызове скрипта как параметр (если в пути есть пробелы - путь передавать в "кавычках") »

Прошу прощения за навязчивость, но можно ли сделать так, чтобы скрипт еще изменял в исходящем docx поля автор, ключевые слова, название (эти поля показываются, если вызвать окно "сохранить как")?

Iska 05-06-2017 13:09 2742222

Можно. Опишите, что на что, по каким принципам изменять.

Sisin 06-06-2017 11:18 2742414

Цитата:

Цитата Iska
Можно. Опишите, что на что, по каким принципам изменять. »

Автор - Пупкин
ключевые слова - Пусто
название - Пусто

Iska 12-06-2017 06:55 2743839

Что-то коллеги молчат, я думал они и продолжат…

Добавьте в начало скрипта:
Код:

Const wdPropertyTitle = 1
Const wdPropertyAuthor = 3
Const wdPropertyKeywords = 4

и перед «Call .ActiveDocument.SaveAs2(…)»:
Код:

                                With .ActiveDocument.BuiltInDocumentProperties
                                        .Item(wdPropertyAuthor)  = "Пупкин"
                                        .Item(wdPropertyTitle)    = ""
                                        .Item(wdPropertyKeywords) = ""
                                End With


SharkyEXE 11-05-2018 19:57 2813286

Всем здравствуйте.

Ищется способ пакетного конвертирования из docx в doc ( есть много машин, в которых максимум установлен Microsoft Office 2003 )

Желательно максимально класический способ, чем примитивнее, тем лучше - типа последовательно по алфавиту, от А до Я, от A до Z, открывать файлы docx, выбирать Файл -> Сохранить как, выбирается Документ Word 97-2003 (*.doc)

Скрытый текст
То есть для работы способа требуется Microsoft Office 2010, файлы преобразуются из docx в doc, docx можно удалить, можно оставить ( желательно сделать коммент в скрипте ), после чего файлы doc можно открывать в Microsoft Office 2003

Iska 12-05-2018 01:11 2813311

Цитата:

Цитата SharkyEXE
То есть для работы способа требуется Microsoft Office 2010, »

Не обязательно. Как я понимаю, это может быть и Microsoft Office 2003 с установленным пакетом обеспечения совместимости.

Цитата:

Цитата SharkyEXE
Ищется способ пакетного конвертирования из docx в doc ( есть много машин, в которых максимум установлен Microsoft Office 2003 ) »

Так зачем конвертировать? Разверните на машинах с Microsoft Office 2003 тот самый пакет обеспечения совместимости — и работайте.

Подумайте, так ли уж Вам потребно переводить все документы в старый формат?

SharkyEXE 12-05-2018 06:09 2813318

Iska

Здравствуйте.

Да, оочень хочется.

Мне проще локализовать проблему у меня с моими файлами, мои проблемы, чем надеяться, что нет времени у меня ждать и верить, что будут переустанавливать офис с 2003 на 2010, или устанавливать пакет совместимости на офис 2003, а так я всегда уверен - 99,9% у меня ходовых, рабочих файлов в формате doc, на любой машине открыл и работай

Спасибо.

Iska 12-05-2018 08:34 2813324

SharkyEXE, ну, как хотите. Вот как-то так, пробуйте (под Microsoft Office 2003 с установленным пакетом обеспечения совместимости, более высокой версии Microsoft Office у меня нет):
Скрытый текст
Код:

Option Explicit

Const wdAlertsNone = 0
Const wdAlertsAll = -1

Const wdFormatDocument = 0

Const ForAppending = 8


Dim strSourceFolder

Dim objFSO
Dim objFile
Dim objTS

Dim objWord
Dim objDocument

Dim lngTotalDocumentsCount


If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                Set objWord = Nothing
               
                lngTotalDocumentsCount = 0
               
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        If StrComp(objFSO.GetExtensionName(objFile.Name), "docx", vbTextCompare) = 0 Then
                                lngTotalDocumentsCount = lngTotalDocumentsCount + 1
                               
                                If objWord Is Nothing Then
                                        Set objWord = WScript.CreateObject("Word.Application")
                                        objWord.DisplayAlerts = wdAlertsNone
                                       
                                        Set objTS = objFSO.OpenTextFile(objFSO.BuildPath(objFSO.GetParentFolderName(WScript.ScriptFullName), "Converting Results.log"), ForAppending, True)
                                        objTS.WriteLine String(79, "=")
                                        objTS.WriteLine Now() & vbTab & "Start scanning source folder [" & strSourceFolder & "]."
                                End If
                               
                                objTS.WriteLine Now() & vbTab & objFile.Path
                               
                                Set objDocument = objWord.Documents.Open(objFile.Path)
                                objDocument.SaveAs objFSO.BuildPath(objFile.ParentFolder.Path, objFSO.GetBaseName(objFile.Name) & ".doc"), wdFormatDocument
                                objDocument.Close
                        End If
                Next
               
                If Not objWord Is Nothing Then
                        objTS.WriteLine Now() & vbTab & "Finish scanning source folder [" & strSourceFolder & "]."
                        objTS.WriteLine Now() & vbTab & "Total [" & lngTotalDocumentsCount & "] documents found."
                        objTS.WriteLine String(79, "=")
                        objTS.WriteLine
                        objTS.Close
                        Set objTS = Nothing
                       
                        objWord.DisplayAlerts = wdAlertsAll
                        objWord.Quit
                        Set objWord = Nothing
                End If
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

WScript.Quit 0


Рядом со скриптом будет создаваться и дописываться файл Converting Results.log с результатами.

SharkyEXE 12-05-2018 08:44 2813325

Iska

Здравствуйте.

Да тут не то, что мне нечем заняться, просто реально проще мне подстоиться, пару сотен файлов перевести из docx в doc - и мне станет проще.

А как пользоваться, можно инстуркцию, пожалуйста?

У меня установлен Microsoft Office 2010

На рабочем столе при помощи програмы AkelPad создал файл 1.vbs с Вашим кодом тынц ( кодировка: 1251 (ANSI - кириллица) )

На рабочем столе сделал Файл -> Создать -> Документ Microsoft Word, на рабочем столе появился файл Документ Microsoft Word.docx , внутри файла Документ Microsoft Word.docx на клавиатуре один раз нажата цифра 1, после чего нажато два раза кнопка Enter на клавиатуре

Перетащил файл Документ Microsoft Word.docx на 1.vbs

Итого: https://cloud.mail.ru/public/DVUU/CVr8Hhkx4

Просто мне хочется понять, как Вы задумывали пользоваться, пошагово инстуркция, а не как я извращаюсь в неправильном использовании Вашего труда

Спасибо.

Iska 12-05-2018 11:41 2813340

SharkyEXE, приношу Вам свои извинения, запамятовал дописать.

Скрипт работает с целым каталогом, выбирая оттуда только файлы .docx. Путь к каталогу указывается параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике).

Цитата:

Цитата SharkyEXE
У меня установлен Microsoft Office 2010 »

Вот нет у меня большой уверенности, что в этом случае скрипт будет работать как задумывалось. Я писал под Microsoft Office 2003 с установленным пакетом обеспечения совместимости.

Цитата:

Цитата SharkyEXE

Скрипт сообщает, что не смог найти папку с именем «Документ Microsoft Word.docx» :).

SharkyEXE 12-05-2018 12:10 2813346

Iska

Здравствуйте.

Большое Вам спасибо.

Я вот что подумал - а нет самодостаточного, автономного способа, без установленного офиса, без установленного пакета обеспечения совместимости, типа версия без установки в систему, портативная, конвертации из docx в doc, из xlsx в xls?

Iska 12-05-2018 23:42 2813433

SharkyEXE, теоретически, конечно, может и есть, хотя внутренний формат .doc/.xls & etc проприентарен и вроде как никогда не открывался для широкой публики. Я не интересовался данным вопросом специально.

Для прямой конвертации был выпущено средство (но пакет обеспечения совместимости там нужен ;)), посмотрите эту недавнюю тему: [решено] Пакетная конвертация doc в docx.

SharkyEXE 12-05-2018 23:46 2813436

Iska

Здравствуйте.

То есть можно толкьо установить пакет обеспечения совместимости, не устанавливая сам офис, поулченные файлы после установки пакета обеспечения совместимости забросить на флешку, удалить пакет обеспечения совместимости, чего-то запустить и будет конвертироваться ( благодаря файлам на флешке) или как?

Тогда и получается портативная версия, все файлы на флешке

Спасибо.

Iska 12-05-2018 23:59 2813438

Цитата:

Цитата SharkyEXE
не устанавливая сам офис, »

А вот не знаю. Возможно. Не пробовал. Там сказано только, что пакет обеспечения совместимости требуется устанавливать, даже если у Вас уже есть установленный Office 2007 :). И ещё один пакет понадобится.

Цитата:

Цитата SharkyEXE
или как? »

Боюсь, что будет именно или как. Впрочем, повторюсь: не знаю — сам не пользовал и не проверял.

А зачем флешка, портативная версия? Разве нельзя сие сделать просто по сети?!

SharkyEXE 13-05-2018 00:03 2813439

Iska

А что плохого-то в задумке, что на флешке будет россыпь файлов, пусть даже на флешке будету становлен офис, зато на любом компьютере можно будет получить нужынй формат файла при помощи конвертации

А компьютер сам будет чистым, весь хлам на флешке, благо флешки есть сейчас шустрые

Iska 13-05-2018 00:39 2813451

Я не про то. Я про: «Сеть придумана для того, чтобы не бегать с дискетами»™ ;).


Время: 07:29.

Время: 07:29.
© OSzone.net 2001-