Пакетный поиск и замена дефиса дефисом с помощью пакетной команды Windows - PullRequest
0 голосов
/ 14 февраля 2019

Несколько файлов, расположенных внутри подпапок, имеют одинаковые имена и последовательно D.C. _ 18 CA 2616 –00000001.txt.Хотел бы найти и заменить "en dash" char, найденный прямо перед 0000*, дефисом.

например, с D.C. _ 18 CA 2616 –00000001.txt до D.C. _ 18 CA 2616 -00000001.txt

Уже пробовал ...

@echo off
Setlocal enabledelayedexpansion

Set "Pattern=–"
Set "Replace=-"

For /R %%a in (*–*) Do (
set "File=%%~nxa"
Ren "%%a" "!File:%Pattern%=%Replace%!"
)

Pause&Exit

1 Ответ

0 голосов
/ 14 февраля 2019

Это очень сложная задача, поскольку символ en dash - это кодовая точка Unicode U + 2013.В стандартном командном процессоре Windows он использует кодовую страницу консоли 437.Символ û является символом номер 150 в кодовой странице 437. Таким образом, похоже, что один процесс записывает файл в кодовой странице 1252, а другой - его чтение с использованием кодовой страницы 437. - Лучшее объяснение проблемы здесь

Чтобы это исправить, мы можем использовать chcp 1252 в начале скрипта, чтобы изменить кодовую страницу консоли 437 на 1252.

Поскольку мы имеем дело с символами Юникода, если выпопытайтесь вставить û в простой редактор текстовых файлов, он изменит его на en dash .Чтобы обойти это, я использую редактор notepad ++ и меняю кодировку в редакторе (Кодировка, Наборы символов, Западноевропейский, OEM-US), чтобы редактор мог вставить символ û,- Более подробное объяснение о проблеме здесь .

ChangeEnDashToDash.bat:

@echo off
setlocal EnableDelayedExpansion
chcp 1252>NUL

Rem | Get Each File Name
for /f "tokens=*" %%A in ('dir "*.txt" /b') do (

    Rem | Get Each File Name
    for /f "tokens=*" %%B in ('Echo %%A^| find /i "û"') do (

        Rem | Save Original Name
        Set "OriginalName=%%B"

        Rem | Get New Name
        SET "ModifiedName=!OriginalName:û=-%!"

        Ren "!OriginalName!" "!ModifiedName!"

    )
)

goto :EOF

Код, приведенный ниже, изменит любой на - просто с помощью синтаксическая замена .Чтобы получить файлы .txt, мы можем использовать цикл for вместе с dir "*.txt" /b.Затем с помощью Echo %%A^| find /i "û" будут отображаться только имена файлов с .Оттуда мы можем установить несколько строк и переименовать их.

Если вы также хотите искать в подкаталогах, измените dir "*.txt" /b на dir "*.txt" /b /s.Я оставил несколько операторов rem, чтобы помочь объяснить процесс сценария.


Для получения справки по любой из команд выполните следующее:

  • set /?
  • for /?
  • if /?
  • ren /?
  • и т. Д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...