Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Переименование файлов .doc в .docx

Ответить
Настройки темы
CMD/BAT - Переименование файлов .doc в .docx

Аватара для Falcon99

Пользователь


Сообщения: 106
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: Falcon99
Дата: 06-08-2018
Прошу помощи, нужен скрипт для переименования файлов.
К нам периодически поступают файлы docx, но с расширением doc. Поэтому необходим cmd файл для переименования.
Нечто похожее на такое:

Код: Выделить весь код
@chcp 1251
:loop
@IF "%~1" == "" chcp 866 & EXIT /b
rename "%~1" "%~1"x
@shift
@GOTO :loop
Но необходимо добавить проверки для переименования:
- расширение файла doc
- первые два символа в содержимом файла "PK", чтобы убедиться что это действительно docx
для того чтобы не переименовывались ненужные файлы.

Отправлено: 10:46, 06-08-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Falcon99:
- первые два символа в содержимом файла "PK", чтобы убедиться что это действительно docx »
Это не «действительно docx». Это ZIP.

На PowerShell:
Скрытый текст
Код: Выделить весь код
Param (
    [System.String]$sSourceFile
)

if([System.IO.File]::Exists($sSourceFile)) {
    if(([System.IO.FileInfo]$sSourceFile).Extension -eq '.doc') {
        $oFileStream = [System.IO.File]::OpenRead($sSourceFile)
        $bPKFound = $oFileStream.ReadByte() -eq 0x50 -and $oFileStream.ReadByte() -eq 0x4B
        $oFileStream.Close()

        if($bPKFound) {
            [System.IO.File]::Move($sSourceFile, $sSourceFile + 'x')
            Write-Host "Rename source file [$sSourceFile] into [$($sSourceFile)x]." -ForegroundColor Green
        } else {
            Write-Host "Source file [$sSourceFile] probably not a DOCX file with DOC extension." -ForegroundColor Red
        }
    } else {
        Write-Host "Source file [$sSourceFile] must has a DOC extension." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find source file [$sSourceFile]." -ForegroundColor Red
}

Отправлено: 14:53, 06-08-2018 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Falcon99

Пользователь


Сообщения: 106
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Iska:
Это не «действительно docx». Это ZIP. »
Нет это действительно не zip. Просто в таком ввиде от нескольких организаций приходят файлы docx.

Цитата Iska:
На PowerShell: »
Спасибо за такой вариант. Но если возможно то желательный вариант в виде bat (cmd) файла. Поэтому пока не буду ставить "Решено".

Отправлено: 15:33, 06-08-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Falcon99:
Нет это действительно не zip. Просто в таком ввиде от нескольких организаций приходят файлы docx. »
Falcon99, docx — это набор из каталогов и файлов, составляющих документ, упакованный в ZIP-формат.


Цитата Falcon99:
Но если возможно то желательный вариант в виде bat (cmd) файла. »
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1

if defined sSourceFile (
	if exist "%sSourceFile%" (
		if "%~x1" equ ".doc" (
			<"%sSourceFile%" set /p sVar=
			
			if defined sVar if "!sVar:~0,2!" equ "PK" (
				ren "%sSourceFile%" "%~nx1x"
				echo Rename source file [%sSourceFile%] into [%sSourceFile%x].
			) else (
				echo Source file [%sSourceFile%] probably not a DOCX file with DOC extension.
				exit /4
			)
		) else (
			echo Source file [%sSourceFile%] must has a DOC extension.
			exit /b 3
		)
	) else (
		echo Can't find source file [%sSourceFile%].
		exit /b 2
	)
) else (
	echo Usage: "%~nx0" ^<Source file^>
	exit /b 1
)

endlocal
exit /b 0

Могут быть определённые проблемы при попытке чтения текста из двоичного файла. Имейте это в виду и не удивляйтесь, ежели не на всех файлах будет работать.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:37, 06-08-2018 | #4


Аватара для Falcon99

Пользователь


Сообщения: 106
Благодарности: 1

Профиль | Отправить PM | Цитировать


Благодарю, именно то что надо. На всякий случай заберу оба варианта.
На другом форуме мне предложили такой вариант решения:
Код: Выделить весь код
@echo off 
 >nul chcp 1251 
 :loop 
 if "%~1" == "" chcp 866 & exit /b 
 if /i not "%~x1"==".doc" goto loop 
 <"%~1"  set /p xx= 
 if not "%xx:~0,2%"=="PK" goto loop  
 rename "%~1" "%~1x" 
 shift 
 goto loop
Как вы думаете, какой вариант более правильный и работоспособный?

Отправлено: 17:04, 06-08-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Falcon99:
Как вы думаете, какой вариант более правильный и работоспособный? »
Попробуйте выполнить код из сообщения #5 с любым файлом, кроме .doc . Даже с несуществующем.

А самый правильный — на PowerShell.

Отправлено: 17:24, 06-08-2018 | #6


Аватара для Falcon99

Пользователь


Сообщения: 106
Благодарности: 1

Профиль | Отправить PM | Цитировать


Все, понял, вариант идентичен с тем что мне предложили на другом сайте, просто из-за использования другого варианта условий, выглядит более объемно, плюс добавлены значения для Errorlevel. Правда возник вопрос по строчке:
Код: Выделить весь код
<"%sSourceFile%" set /p sVar=
Почему так, а не более привычно:
Код: Выделить весь код
 set /p sVar= <"%sSourceFile%"
Цитата Iska:
А самый правильный — на PowerShell. »
PowerShell не подходит по двум причинам: на большинстве машин увы Windows XP, да и интегрировать хочу или на правую клавишу, через подменю отправить, или сделать ярлык на рабочем столе, для того чтобы на него перетягивали проблемный файл, а powershell по умолчанию вроде отрабатывать не будет.

Последний раз редактировалось Falcon99, 06-08-2018 в 17:57. Причина: Расширено сообщение.


Отправлено: 17:42, 06-08-2018 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Falcon99:
на большинстве машин увы Windows XP »
PowerShell устанавливается на Windows XP, вторая версия.

Цитата Falcon99:
да и интегрировать хочу или на правую клавишу, через подменю отправить, или сделать ярлык на рабочем столе, для того чтобы на него перетягивали проблемный файл, а powershell по умолчанию вроде отрабатывать не будет. »
Да, по умолчанию отрабатывать не будет, поскольку там не глагол Выполнить, а Редактировать. Но вот как раз на Отправить или через ярлык — сделать можно.

Цитата Falcon99:
Почему так, а не более привычно: »
Для меня как раз более привычно использовать перенаправление в начале команды.

Отправлено: 18:04, 06-08-2018 | #8


Аватара для Falcon99

Пользователь


Сообщения: 106
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Iska:
Да, по умолчанию отрабатывать не будет, поскольку там не глагол Выполнить, а Редактировать. Но вот как раз на Отправить или через ярлык — сделать можно. »
Через ярлык не работает, только что проверил. Просто не дает на него "кинуть" файл.

Отправлено: 18:09, 06-08-2018 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Да ладно .

Скрытый текст






Содержимое поля Объект ярлыка для моего случая и моей версии PowerShell:
Код: Выделить весь код
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Мои проекты\0179\Untitled4.ps1"
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:26, 06-08-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Переименование файлов .doc в .docx

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Работа с документами doc и docx без NET tumanovalex Программирование и базы данных 2 12-06-2018 00:15
CMD/BAT - doc в docx Sisin Скриптовые языки администрирования Windows 33 13-05-2018 00:39
2007 - [решено] Пакетная конвертация doc в docx tumanovalex Microsoft Office (Word, Excel, Outlook и т.д.) 2 11-04-2018 23:01
CMD/BAT - [решено] Пересохранить документы из DOC в DOCX NikolayHAOS Скриптовые языки администрирования Windows 6 19-08-2017 12:22
Офис и Текст - Программы для конвертирования DOCX в DOC thief_89 Программное обеспечение Windows 1 13-08-2007 14:53




 
Переход