Компьютерный форум 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=336046)

Falcon99 06-08-2018 10:46 2825049

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

Код:

@chcp 1251
:loop
@IF "%~1" == "" chcp 866 & EXIT /b
rename "%~1" "%~1"x
@shift
@GOTO :loop

Но необходимо добавить проверки для переименования:
- расширение файла doc
- первые два символа в содержимом файла "PK", чтобы убедиться что это действительно docx
для того чтобы не переименовывались ненужные файлы.

Iska 06-08-2018 14:53 2825087

Цитата:

Цитата 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
}


Falcon99 06-08-2018 15:33 2825096

Цитата:

Цитата Iska
Это не «действительно docx». Это ZIP. »

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

Цитата:

Цитата Iska
На PowerShell: »

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

Iska 06-08-2018 16:37 2825105

Цитата:

Цитата 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


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

Falcon99 06-08-2018 17:04 2825112

Благодарю, именно то что надо. На всякий случай заберу оба варианта.
На другом форуме мне предложили такой вариант решения:
Код:

@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

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

Iska 06-08-2018 17:24 2825117

Цитата:

Цитата Falcon99
Как вы думаете, какой вариант более правильный и работоспособный? »

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

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

Falcon99 06-08-2018 17:42 2825120

Все, понял, вариант идентичен с тем что мне предложили на другом сайте, просто из-за использования другого варианта условий, выглядит более объемно, плюс добавлены значения для Errorlevel. Правда возник вопрос по строчке:
Код:

<"%sSourceFile%" set /p sVar=
Почему так, а не более привычно:
Код:

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

Iska 06-08-2018 18:04 2825122

Цитата:

Цитата Falcon99
на большинстве машин увы Windows XP »

PowerShell устанавливается на Windows XP, вторая версия.

Цитата:

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

Да, по умолчанию отрабатывать не будет, поскольку там не глагол Выполнить, а Редактировать. Но вот как раз на Отправить или через ярлык — сделать можно.

Цитата:

Цитата Falcon99
Почему так, а не более привычно: »

Для меня как раз более привычно использовать перенаправление в начале команды.

Falcon99 06-08-2018 18:09 2825124

Цитата:

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

Через ярлык не работает, только что проверил. Просто не дает на него "кинуть" файл.

Iska 06-08-2018 18:26 2825129

Да ладно :).

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






Содержимое поля Объект ярлыка для моего случая и моей версии PowerShell:
Код:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Мои проекты\0179\Untitled4.ps1"

Falcon99 07-08-2018 08:32 2825205

Спасибо, про такой вариант ярлыка даже не догадывался. Очень полезные ответы. Ответы все получены, поэтому закрываю.

Iska 07-08-2018 08:52 2825208

Falcon99, а Вы, наверное, создавали ярлык на сам файл .ps1?

Falcon99 07-08-2018 15:13 2825280

Да, просто до этого скрипты запуска только в PowerShell и не знал таких тонкостей.


Время: 23:20.

Время: 23:20.
© OSzone.net 2001-