Показать полную графическую версию : Переименование файлов .doc в .docx
Falcon99
06-08-2018, 10:46
Прошу помощи, нужен скрипт для переименования файлов.
К нам периодически поступают файлы docx, но с расширением doc. Поэтому необходим cmd файл для переименования.
Нечто похожее на такое:
@chcp 1251
:loop
@IF "%~1" == "" chcp 866 & EXIT /b
rename "%~1" "%~1"x
@shift
@GOTO :loop Но необходимо добавить проверки для переименования:
- расширение файла doc
- первые два символа в содержимом файла "PK", чтобы убедиться что это действительно docx
для того чтобы не переименовывались ненужные файлы.
- первые два символа в содержимом файла "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
Это не «действительно docx». Это ZIP. »
Нет это действительно не zip. Просто в таком ввиде от нескольких организаций приходят файлы docx.
На PowerShell: »
Спасибо за такой вариант. Но если возможно то желательный вариант в виде bat (cmd) файла. Поэтому пока не буду ставить "Решено".
Нет это действительно не zip. Просто в таком ввиде от нескольких организаций приходят файлы docx. »
Falcon99, docx — это набор из каталогов и файлов, составляющих документ, упакованный в ZIP-формат.
Но если возможно то желательный вариант в виде 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
Благодарю, именно то что надо. На всякий случай заберу оба варианта.
На другом форуме мне предложили такой вариант решения:
@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
Как вы думаете, какой вариант более правильный и работоспособный?
Как вы думаете, какой вариант более правильный и работоспособный? »
Попробуйте выполнить код из сообщения #5 с любым файлом, кроме .doc :). Даже с несуществующем.
А самый правильный — на PowerShell.
Falcon99
06-08-2018, 17:42
Все, понял, вариант идентичен с тем что мне предложили на другом сайте, просто из-за использования другого варианта условий, выглядит более объемно, плюс добавлены значения для Errorlevel. Правда возник вопрос по строчке: <"%sSourceFile%" set /p sVar=Почему так, а не более привычно: set /p sVar= <"%sSourceFile%" Цитата Iska:
А самый правильный — на PowerShell. »
PowerShell не подходит по двум причинам: на большинстве машин увы Windows XP, да и интегрировать хочу или на правую клавишу, через подменю отправить, или сделать ярлык на рабочем столе, для того чтобы на него перетягивали проблемный файл, а powershell по умолчанию вроде отрабатывать не будет.
на большинстве машин увы Windows XP »
PowerShell устанавливается на Windows XP, вторая версия.
да и интегрировать хочу или на правую клавишу, через подменю отправить, или сделать ярлык на рабочем столе, для того чтобы на него перетягивали проблемный файл, а powershell по умолчанию вроде отрабатывать не будет. »
Да, по умолчанию отрабатывать не будет, поскольку там не глагол Выполнить, а Редактировать. Но вот как раз на Отправить или через ярлык — сделать можно.
Почему так, а не более привычно: »
Для меня как раз более привычно использовать перенаправление в начале команды.
Falcon99
06-08-2018, 18:09
Да, по умолчанию отрабатывать не будет, поскольку там не глагол Выполнить, а Редактировать. Но вот как раз на Отправить или через ярлык — сделать можно. »
Через ярлык не работает, только что проверил. Просто не дает на него "кинуть" файл.
Да ладно :).
https://i.imgur.com/o10e7WE.png
https://i.imgur.com/XgTJ00e.png
https://i.imgur.com/EZ9r8kn.png
Содержимое поля Объект ярлыка для моего случая и моей версии PowerShell:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Мои проекты\0179\Untitled4.ps1"
Falcon99
07-08-2018, 08:32
Спасибо, про такой вариант ярлыка даже не догадывался. Очень полезные ответы. Ответы все получены, поэтому закрываю.
Falcon99, а Вы, наверное, создавали ярлык на сам файл .ps1?
Falcon99
07-08-2018, 15:13
Да, просто до этого скрипты запуска только в PowerShell и не знал таких тонкостей.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.