|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] переименования файлов |
|
CMD/BAT - [решено] переименования файлов
|
Старожил Сообщения: 300 |
Профиль | Отправить PM | Цитировать Привет всем! помогите со скриптом, есть n-ое кол-во файлов docx и txt файл (в нем список имен) нужен скрипт которые будет брать имена с txt файла и переименовывать docx файлы согласно списка в txt файле
|
|
Отправлено: 10:24, 07-12-2017 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать я так понимаю список один и только имен которые надо хаотически раскидать файлам docx, так как первое имя первому файлу правильно звучит: первое по алфавиту имя в списке первому (по алфавиту, а может и нет, как по умолчанию выставлено ...?) файлу в папке.
например было: Файл 149931 после выполнения кода: @echo off set "d=C:\papka" set "exp=docx" set "f=spisok.txt" if "%~1" neq "" (call %* & exit /b) call :# :#1 call :# :#2 exit /b :# pushd "%d%" start "" cmd /c "%~f0 %*" popd exit /b :#1 for /f "usebackq delims=" %%a in ("%f%") do call :#2 "%%a" exit /b :#2 for /f "delims=" %%a in ('dir /a-d/b "*.%exp%"') do if "%%a" neq "" ren "%%a" "%~1%%~xa" exit /b Файл 149932 spisok.txt видно где, в кодировке 866 name.bat не важно где, в кодировке 866 или так можно, но кодировка тоже везде 866 @echo off set "d=C:\papka" set "exp=docx" set "f=spisok.txt" pushd "%d%" for /f "tokens=1* delims=[]" %%a in ('dir /a-d/b "*.%exp%"^|find /n /v ""') do call :rn "%%b" "%%a" popd pause& exit :rn <"%f%" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^|find "[%~2]"') do @ren "%~1" "%%b%~x1") exit /b |
Последний раз редактировалось alpap, 21-06-2018 в 14:15. Отправлено: 15:10, 07-12-2017 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 300
|
Профиль | Отправить PM | Цитировать Цитата alpap:
Я этот многостраничный файл word обрабатываю скриптом этот скрипт мне создает много файлов word (в каждом файле по 2 странице). Пример файлов после обработки обращение в суд1.docx обращение в суд2.docx обращение в суд3.docx обращение в суд4.docx и т.д. У меня есть таблица excel которые служит для слияния в документом word в этой таблице есть столбик ФИО Я этот столбик копирую в блокнот и у меня получается: Иванов Иван Иванович Петров Артем Николаевич Петренко Игорь Иванович Сидоров Антон Владимирович и т.д. Мы берем первую строчку Иванов Иван Иванович и переименовываем обращение в суд1.docx у нас получается Иванов Иван Иванович.docx берем вторую строчку Петров Артем Николаевич и переименовываем обращение в суд2.docx у нас получается Петров Артем Николаевич.docx и так далее |
|
Последний раз редактировалось mcintosh55, 07-12-2017 в 16:28. Отправлено: 16:21, 07-12-2017 | #12 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать mcintosh55, вот всё как всегда. Ну, что бы Вам стоило изложить Вашу основную проблему, а не выбранное Вами решение частной задачи, а? Надо править Ваш:
Цитата mcintosh55:
|
|
Отправлено: 16:50, 07-12-2017 | #13 |
Старожил Сообщения: 300
|
Профиль | Отправить PM | Цитировать вот как только? Вы перелагаете дописать скрипт где он разбивает один большой файл на маленькие файлы дергать ФИО excel файла и сразу переименовывать файл на выходе?
|
Отправлено: 17:03, 07-12-2017 | #14 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата mcintosh55:
Ведь что у нас получается: мы знаем имена этих частей в момент слияния, мы даже можем узнать эти имена в момент сохранения отдельных частей (если они добавляются куда-либо в текст документа при слиянии, и мы знаем, куда именно). |
|
Отправлено: 17:15, 07-12-2017 | #15 |
Старожил Сообщения: 300
|
Профиль | Отправить PM | Цитировать осталось понять как это запилить ))) слияние еще понятно а вот как потом при разбивки сохранять под нужным именем вот это вопрос
Sub SplitIntoPages() Dim docMultiple As Document Dim docSingle As Document Dim rngPage As Range Dim iCurrentPage As Integer Dim iPageCount As Integer Dim strNewFileName As String Application.ScreenUpdating = False 'Makes the code run faster and reduces screen _ flicker a bit. Set docMultiple = ActiveDocument 'Work on the active document _ (the one currently containing the Selection) Set rngPage = docMultiple.Range 'instantiate the range object iCurrentPage = 1 'get the document's page count iPageCount = docMultiple.Content.ComputeStatistics(wdStatisticPages) Do Until iCurrentPage > iPageCount If iCurrentPage = iPageCount Then rngPage.End = ActiveDocument.Range.End 'last page (there won't be a next page) Else 'Find the beginning of the next page 'Must use the Selection object. The Range.Goto method will not work on a page Selection.GoTo wdGoToPage, wdGoToAbsolute, iCurrentPage + 2 'Set the end of the range to the point between the pages rngPage.End = Selection.Start End If rngPage.Copy 'copy the page into the Windows clipboard Set docSingle = Documents.Add 'create a new document docSingle.Range.Paste 'paste the clipboard contents to the new document 'remove any manual page break to prevent a second blank docSingle.Range.Find.Execute Findtext:="^m", ReplaceWith:="" 'build a new sequentially-numbered file name based on the original multi-paged file name and path strNewFileName = Replace(docMultiple.FullName, ".doc", "_" & Right$("000" & iCurrentPage, 4) & ".doc") docSingle.SaveAs strNewFileName 'save the new single-paged document iCurrentPage = iCurrentPage + 2 'move to the next page docSingle.Close 'close the new document rngPage.Collapse wdCollapseEnd 'go to the next page Loop 'go to the top of the do loop Application.ScreenUpdating = True 'restore the screen updating 'Destroy the objects. Set docMultiple = Nothing Set docSingle = Nothing Set rngPage = Nothing End Su |
Последний раз редактировалось mcintosh55, 07-12-2017 в 17:27. Отправлено: 17:22, 07-12-2017 | #16 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать mcintosh55, хотите расскажу — как? Вы готовите:
Цитата mcintosh55:
Цитата Iska:
|
||
Отправлено: 17:35, 07-12-2017 | #17 |
Старожил Сообщения: 300
|
Профиль | Отправить PM | Цитировать |
Отправлено: 17:53, 07-12-2017 | #18 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать mcintosh55, давайте попробуем проверить работоспособность подхода в его самом первом приближении.
Для начала Вам нужно удалить все ранее заполненные строки, ныне очищенные, но тем не менее значимые строки из Рабочей книги base.xls. Откройте эту Рабочую книгу, выделите какую-нибудь ячейку на первом листе Лист1, нажмите Ctrl-End. Видите, какая ячейка стала текущей? Все эти строки, пусть и видимо пустые, надо будет удалить. Выделите строки с 4 по 130 (чтоб с запасом) и удалите их. Их следует именно удалить, а не очистить их содержимое! В принципе, свойство .SuppressBlankLines должно бы было позволять игнорировать такие строки, но, похоже, оно работает несколько иначе, нежели мне предполагалось, увы. Затем попробуйте исполнить следующий код, сохранив его в файле с расширением .wsf и заменив в нём все пути на Ваши: Скрытый текст
<job> <object ProgId = "Word.Application" id = "objWord" events = "true" /> <script language = "VBScript"> Option Explicit Const wdFormLetters = 0 Const wdSendToNewDocument = 0 Const wdDefaultFirstRecord = 1 Const wdDefaultLastRecord = -16 Const wdNextRecord = -2 Dim objDocument Dim objCurrResultDocument Dim i Dim strDocumentName objWord.Visible = True Set objDocument = objWord.Documents.Open("C:\Мои проекты\0136\order.doc", , True) With objDocument.MailMerge .MainDocumentType = wdFormLetters .OpenDataSource _ "C:\Мои проекты\0136\base.xls", _ ,,,,,,,,,, _ "Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;Jet OLEDB:Engine Type=35;""", _ "SELECT * FROM `Лист1$`" .Destination = wdSendToNewDocument .SuppressBlankLines = True For i = wdDefaultFirstRecord To .DataSource.RecordCount .DataSource.FirstRecord = .DataSource.ActiveRecord .DataSource.LastRecord = .DataSource.ActiveRecord Set objCurrResultDocument = Nothing strDocumentName = .DataSource.DataFields.Item("SNP").Value .Execute False .DataSource.ActiveRecord = wdNextRecord Do WScript.Sleep 100 Loop Until Not objCurrResultDocument Is Nothing objCurrResultDocument.Close Next End With objDocument.Close False WScript.DisconnectObject objWord objWord.Quit WScript.Quit 0 Sub objWord_MailMergeAfterMerge(ByVal objResultDocument, ByVal objMainDocument) objResultDocument.SaveAs "C:\Мои проекты\0136\" & strDocumentName & ".doc" Set objCurrResultDocument = objResultDocument WScript.Echo "Mail Merge Complete: " & objResultDocument.FullName End Sub </script> </job> Я здесь не делал пока никаких проверок, только проверил работоспособность. У меня результатом было создание двух файлов: |
Отправлено: 22:01, 07-12-2017 | #19 |
Старожил Сообщения: 300
|
Профиль | Отправить PM | Цитировать office 2013 /2016, скрипт ругается на 5 строчку: Методы или свойство OpenDataSource недоступны, потому что эту команду нельзя использовать в режиме чтения. И действительно word запускаться в режиме чтения
Защищенный просмотр все галки сняты |
Последний раз редактировалось mcintosh55, 07-12-2017 в 23:25. Отправлено: 22:45, 07-12-2017 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Батник для переименования файлов | Школьник 5 | Скриптовые языки администрирования Windows | 21 | 30-11-2019 21:58 | |
VBS/WSH/JS - VBS Скрипт переименования файлов | wwtf | Скриптовые языки администрирования Windows | 6 | 26-04-2017 14:00 | |
CMD/BAT - [решено] батник для переименования файлов | Pumpik | Скриптовые языки администрирования Windows | 5 | 01-02-2014 20:12 | |
CMD/BAT - [решено] не работает счетчик переименования файлов | Xeruvim4ik | Скриптовые языки администрирования Windows | 13 | 15-04-2013 21:57 | |
Скрипт автоматического переименования файлов mp3 | Ламер | Программирование в *nix | 2 | 02-03-2011 19:59 |
|