Пакетное удаление спецсимволов из имен файлов в Windows

Пакетное удаление спецсимволов из имен файлов в Windows

Я новичок в пакетном написании сценариев.

Есть решения по этому вопросуLinux и MacOS, но мне это нужно для Windows.

У меня есть следующее, которое работает только со специальными символами !@#$%^&*~ и т. д., в основном теми, которые вы видите на клавиатуре. Но мне нужно удалить специальные символы, такие как Â и °. Следующие скрипты не работают с этими двумя конкретными символами., скрипт, который я могу запустить через cmd. Естьэтотно он не совместим с windows7 cmd.

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *#*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:#=!"
    ren "!fname!" "!nname!"
    endlocal
)

И следующее, которое может удалить пробелы только в именах файлов

@echo off
setlocal disableDelayedExpansion
if /i "%~1"=="/R" (
  set "forOption=%~1 %2"
  set "inPath="
) else (
  set "forOption="
  if "%~1" neq "" (set "inPath=%~1\") else set "inPath="
)
for %forOption% %%F in ("%inPath%* *") do (
  if /i "%~f0" neq "%%~fF" (
    set "folder=%%~dpF"
    set "file=%%~nxF"
    setlocal enableDelayedExpansion
    echo ren "!folder!!file!" "!file: =!"
    ren "!folder!!file!" "!file: =!"
    endlocal
  )
)

решение1

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

Вставьте приведенный ниже скрипт в Блокнот. Сохраните как test.bat с кодировкой ANSI.

@echo off &setlocal
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *ø*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:ø=!"
    ren "!fname!" "!nname!"
    endlocal
)

Приведенный выше скрипт будет переименован degree°.txtв degree.txt.

ø используется, потому что это Unicode U+00F8. Символ градуса находится 0xF8в кодовой странице 437.

 не появляется в кодовой странице 437, поэтому я не знаю о параллельном решении. Вероятно, требуетсяизмените кодовую страницу, как указано в этом ответечтобы сделать это правильно. Вот попытка пакетного файла, который включает изменение кодовой страницы.

echo Ignore the error displayed below
@echo off &setlocal
chcp 65001>nul
cd /d c:\users\data
for /f "delims=" %%a in ('dir /b /a-d *Â*.txt') do (
    set "fname=%%~a"
    setlocal enabledelayedexpansion
    set "nname=!fname:Â=!"
    ren "!fname!" "!nname!"
    endlocal
)

Вставьте вышеприведенное в файл Блокнота и сохраните с кодировкой UTF-8. Необходимо включить первую строку скрипта, поскольку пакетный файл выдаст ошибку при первоначальной обработке файла UTF-8.

решение2

Хотел бы я приписать себе это, но это было то, на что я наткнулся случайно. Я не могу найти пост, в котором я это нашел, так что это по памяти.

find . -depth -name "*" -print0 | $var -0 sed -i 's/[:cntrl:]/_/g' *

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

Связанный контент