CMD/BAT - [решено] Удаление нежелательных символов из строки.

Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Удаление нежелательных символов из строки.

Сообщение megaloman »

Цитата megaloman:



Если в Вашем тексте нет гос секретов и вмешательства в американские выборы, хотелось бы протестировать решения на Вашем реальном файле.

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

По видимому, корректнее задавать эту строку в виде массива кодов символов.
CMD/BAT - [решено] Удаление нежелательных символов из строки.




Никаких гос-секретов )) Все гораздо прозаичнее. Хотя подобные штуки уже есть, но, по разным причинам, решил написать свой инструмент для архивирования файловых инфобаз 1с. BAT-ник мал да удал и работает везде. Вобщем - если вам интересно в двух словах - тулза, являясь частью системы автоматизации, формирует меню выбора в виде списка баз на основе файлика ibases.v8i, в котором, среди прочего, хранятся имена и пути. Сам файл, насколько я понял, всегда имеет кодировку utf-8 c bom, поэтому приходится сначала конвертить его в cp866 во временный файл и только потом уже парсить. Это для совместимости батника с WinXP (конвертирую с помощью win_iconv). В результате все просто - нужно лишь выбрать информационную базу из списка меню, а все пути подставятся сами и она благополучно улетит в датированный архив (через 7zip_extra) в подкаталог с именем базы. (это быстро и удобно + сама 1С, во избежание, рекомендует делать архивы копированием, а не выгрузкой - https://its.1c.ru/db/metod8dev#content:2922:hdoc)

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

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



п.п.с Файлик во вложении
Аватара пользователя
Amunrah

Re: CMD/BAT - [решено] Удаление нежелательных символов из строки.

Сообщение Amunrah »

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



IN:



Код:

Код: Выделить всё

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 866>nul
rem ...обрабатываемый текст построчно читается из файла и имеет примерно следующий вид
set "str=some *long:?: $long #&#\te=^^xt <%@and |~№more /more> !more"
call :clean_out_str "%str%"
echo исходная строка - "%str%"
echo результат - %clean_str:"=%
pause >nul
exit
:clean_out_str <str_for_clean>
set this_str=%*
set clean_str=
set /a char_counter=0
rem поиск и удаление нежелательных символов
:del_unwanted_chars
for /f "delims=" %%l in ("!this_str:~%char_counter%,1!") do (
    set current_char=%%~l
    if !current_char! NEQ "" (
        for /f %%f in ('echo "!current_char!"^|findstr /r "[\\|/?:*#^^=@!%&~$<>№]"') do (
            echo.%%f
            if %%f NEQ "" (
                set current_char=
            )
        )
        set clean_str=!clean_str!!current_char!
        set /a char_counter+=1
        goto :del_unwanted_chars
    )
)
exit /b
ENDLOCAL

OUT:



Код:

Код: Выделить всё

"*"
":"
"?"
":"
"$"
"#"
"&"
"#"
"\"
"="
"^"
"^"
"<"
"@"
"|"
"~"
"№"
"/"
">"
исходная строка - "some *long:?: $long #&#\te=^xt <@and |~№more /more> more"
результат - some long long text and more more more

Только кавычки приходится удалять стандартно %result:"=% Тут пример с заданной строкой, поэтому не получается использовать кавычки не экранируя их, но при чтении строк циклом из файла проблем не возникло.[/i] Единственное не удалось победить восклицательный и знак процента - по одиночке они пропадают сами, а в паре вырезают часть заключенного в них текста, не понятно как запретить интерпретатору считать их частью переменной. Но, думаю, это мелочи... радует сам факт, и cmd, как оказалось, не так уж плох )
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Удаление нежелательных символов из строки.

Сообщение alpap »

Amunrah,

кроме парных кавычек проблемы с удалением может доставить знак "="

еще почему-то нет "^", хотя тоже проблемный символ.

вообще как по мне достаточно варианта что я приводил из п7, проблемные строки просто игнорируются с выводом на экран и если учесть что проблемные строки из вашего файла претерпевают изменение, то небольшая разница с игнорированием или можно сделать замену на "name(N+1)"
Аватара пользователя
Amunrah

Re: CMD/BAT - [решено] Удаление нежелательных символов из строки.

Сообщение Amunrah »

alpap:


Цитата alpap:



Amunrah,

кроме парных кавычек проблемы с удалением может доставить знак "="

еще почему-то нет "^", хотя тоже проблемный символ.

вообще как по мне достаточно варианта что я приводил из п7, проблемные строки просто игнорируются с выводом на экран и если учесть что проблемные строки из вашего файла претерпевают изменение, то небольшая разница с игнорированием или можно сделать замену на "name(N+1)"
CMD/BAT - [решено] Удаление нежелательных символов из строки.




Да, вы правы, во многих случаях вполне достаточно вашего варианта, но это скорее обходной маневр,а мне просто хотелось разобраться в проблеме... )

Дополнил регулярку - [\\|/?:*#^^=@!%&~$] - при чтении из файла срабатывает нормально, однако если задавать строку в батнике, то символ ^ нужно экранировать ^^
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Удаление нежелательных символов из строки.

Сообщение Iska »

Цитата megaloman:



Не может быть, чтобы на разных машинах файл для суперзадачи приходит в разных кодировках.
CMD/BAT - [решено] Удаление нежелательных символов из строки.




Именно так.




Цитата megaloman:



Как не изгаляйся, останется вопрос: а зачем всё это нужно?
CMD/BAT - [решено] Удаление нежелательных символов из строки.




Я пишу проще: «нахрена?» Изображение.



Amunrah, многое из того, что Вы выбрасываете, вполне допустимо в путях и именах файлов:
Naming Files, Paths, and Namespaces | Microsoft Docs
. И да — разворачиваете на Windows XP PowerShell 2.0 и перестаёте заниматься извращениями на пакетных файлах ([System.IO.Path]::GetInvalidPathChars()/[System.IO.Path]::GetInvalidFileNameChars()).
Аватара пользователя
Amunrah

Re: CMD/BAT - [решено] Удаление нежелательных символов из строки.

Сообщение Amunrah »

Iska


Цитата Iska:



Amunrah, многое из того, что Вы выбрасываете, вполне допустимо в путях и именах файлов: Naming Files, Paths, and Namespaces | Microsoft Docs. И да — разворачиваете на Windows XP PowerShell 2.0 и перестаёте заниматься извращениями на пакетных файлах ([System.IO.Path]::GetInvalidPathChars()/[System.IO.Path]::GetInvalidFileNameChars()).
CMD/BAT - [решено] Удаление нежелательных символов из строки.




Кто же спорит, но я ведь уже писал, что такой набор символов был выбран интереса ради и общей пользы для. В итоге с удалением недопустимых знаков батник справляется на ура плюс имеет некоторую гибкость и универсальность. Естественно на своем железе можно развернуть вообще все что угодно, вопрос выбора CMD возникает когда нужно автоматизировать рутину на куче чужих машин, где что-то устанавливать, как минимум, лишняя потеря времени...
Ответить

Вернуться в «Скриптовые языки администрирования Windows»