Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление нежелательных символов из строки.

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

Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Изменения
Автор: Amunrah
Дата: 25-10-2018
Доброго времени суток уважаемые форумчане, в процессе написания батника возникла задача - очистить строки от нежелательных символов. Нежелательные символы, в идеале, это - !"№@#$^&*\|/?:%<~>` Частично проблема решается, но не со всеми символами прокатывает. Например &,%,<,>,| и " (двойная кавычка) ведут себя странновато. Подскажите способ их аккуратно извлечь и удалить не потеряв исходный текст, учитывая что строки читаются из файла, нельзя предугадать появление символов и нет возможности экранировать их в файле. Пример того что уже есть:

IN:
Код: Выделить весь код
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
chcp 866>nul
rem ...обрабатываемый текст построчно читается из файла и имеет примерно следующий вид
set str=some *long:: ##\text %@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 /i /r "[\\|/?:*#@!%&~$<>]"') do (
            echo.%%f
            if %%f NEQ "" (
                set current_char=
                goto :next
            )
        )
        :next
        set clean_str=!clean_str!!current_char!
        set /a char_counter+=1
        goto :del_unwanted_chars
    )
)
exit /b
ENDLOCAL
OUT:
Код: Выделить весь код
"*"
":"
":"
"#"
"#"
"\"
"@"
"~"
"/"
исходная строка - "some *long:: ##\text @and ~more /more more "этот текст просто обрежется из-за кавычки"
результат - "some long text and more more more "
Возможно есть альтернативные решения...

Отправлено: 16:36, 25-10-2018

 

Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


Amunrah, в CMD это сделать невозможно (имхо). Вот VBS
Код: Выделить весь код
FileIn = "Z:\Box_In\Большой txt файл.txt"

harm = "!""№@#$^&*\|/?:%<~>`"
useful = " "

Set FSO = CreateObject("Scripting.FileSystemObject")

Set fIn = FSO.OpenTextFile(FileIn, 1, False)  ', -2)
Alls = fIn.ReadAll
fIn.Close

For i = 1 To Len(harm)
    Alls = Replace(Alls, Mid(harm, i, 1), useful)
Next

Set fIn = FSO.CreateTextFile(FileIn, True)
fIn.Write Alls
fIn.Close
Здесь нежелательные символы заменяются пробелами

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:32, 25-10-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


Цитата Amunrah:
в процессе написания батника »
Зачем нужен батник, пока не ясно, какая суперзадача? В CMD имхо замену всех символов из этого набора сделать нельзя. Если принципиально использовать cmd, то можно совместить bat-файл с функцией в виде скрипта js, который эту замену сделает. И можно всё остальное ваять в CMD (между /* и */).
bat c вызовом js
Код: Выделить весь код
@set @E=1; /*

@Echo Off
	cls
	chcp 866 >nul

	Set "FileIn=Z:\Box_In\Большой txt файл.txt"
	Echo "%FileIn%"

	Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn%"
	Pause
GoTo :Eof

*/

var FileIn = WScript.Arguments(0);
//WScript.Echo(FileIn);

//var harm = '!"╣@#$^&*\\|/?:%<~>`';
  var harm = '!"№@#$^&*\\|/?:%<~>`';

var useful = " ";

var lharm=harm.length;

var FSO = WScript.CreateObject("Scripting.FileSystemObject");

var fIn = FSO.OpenTextFile(FileIn, 1, false);
var Alls = fIn.ReadAll();
fIn.Close();

for(var i=0; i<lharm; i++) {
	Alls = Alls.replace(new RegExp('\\'+harm.substr(i,1),'g'),useful);
}

fIn = FSO.CreateTextFile(FileIn, true);
fIn.Write(Alls);
fIn.Close();

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:10, 25-10-2018 | #3


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Amunrah, в CMD это сделать невозможно (имхо). Вот VBS »
Жаль что в CMD не получится. C VBS как-то не сталкивался, но судя по примеру, вроде не очень сложно, и, как бы ни хотелось реализовать все функционалом батника, видимо буду двигаться в сторону VBS. Спасибо за оперативный ответ и рабочий пример.

Цитата megaloman:
Зачем нужен батник, пока не ясно, какая суперзадача? В CMD имхо замену всех символов из этого набора сделать нельзя. Если принципиально использовать cmd, то можно совместить bat-файл с функцией в виде скрипта js, который эту замену сделает. И можно всё остальное ваять в CMD (между /* и */). »
Батник нужен для запуска на машинах юзверей (с разной виндой - от XP до 10-ки), доустановить на которые что-либо не получится. Кстати вариант с js мне кажется очень подходящим. Надо обкатать в работе на разных машинках )

Последний раз редактировалось Amunrah, 25-10-2018 в 20:29.


Отправлено: 20:19, 25-10-2018 | #4


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


Цитата megaloman:
bat c вызовом js »
Все работает, но не очень дружит с русским текстом, удаляет букву т и букву Д - если файл в OEM866 кодировке, при кодировке UTF-8 такого не наблюдается, но буква ф превращается в знак вопроса (пока только это заметил, возможно, что так только у меня...)

Отправлено: 20:56, 25-10-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Amunrah, для каждой кодировки — свой подход нужен. А про пакетные файлы здесь вообще забудьте: только WSH или PowerShell.

Отправлено: 21:22, 25-10-2018 | #6


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


как правильно заметил megaloman в cmd сложно сделать подобные вещи, но можно сделать просто предупреждающий bat.
Например есть файл, в строках которого мы не уверены, но хотим их использовать для имен файлов или папок, поможет такой bat:
(использованы, соответственно символы, запрещенные системой для имен)
Код: Выделить весь код
@echo off
set "f=file.txt"
set "ss=* < > \ / | ? :"

<"%f%" (for /f "delims=" %%a in ('more') do @call :# "%%a")
pause& exit

:#
 for /f "delims=" %%a in ('cmd /v/c echo !ss!') do echo "%~1"|>nul findstr "%%a" && (
   <nul set /p="Есть запрещенный символ из состава: [%ss%] в строке: %~1"& echo:
  ) || (
   md "%~1"
  )
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:33, 25-10-2018 | #7


Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt я181025.js.bat.txt
(716 байт, 2 просмотров)
Тип файла: txt я181025.vbs.txt
(425 байт, 1 просмотров)

Amunrah,
Цитата Amunrah:
удаляет букву т и букву Д - если файл в OEM866 кодировке »
У меня не удаляет. Батник с js и текст в 866 кодировке. Прикрепил к сообщению. (переименовал в txt).
vbs в 1251 кодировке и текст в 866 кодировке тоже работают, но строку для замены пришлось подшаманить, чтобы № заменялся. Прикрепил к сообщению. (переименовал в txt).
Если в Вашем тексте нет гос секретов и вмешательства в американские выборы, хотелось бы протестировать решения на Вашем реальном файле.
И, однозначно, при разных кодировках файлов надо подбирать, как сохранить строку заменяемых символов - её кодировка должна совпадать с кодировкой файла.
По видимому, корректнее задавать эту строку в виде массива кодов символов.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 26-10-2018 в 00:53.


Отправлено: 00:36, 26-10-2018 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
По видимому, корректнее задавать эту строку в виде массива кодов символов. »
Дык, всё равно нужно будет знать кодировку исходного файла.

Отправлено: 06:31, 26-10-2018 | #9


Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


Iska, каждая задача должна иметь конечный смысл. Замена символов в файле - не конечная цель. Не может быть, чтобы на разных машинах файл для суперзадачи приходит в разных кодировках. Как не изгаляйся, останется вопрос: а зачем всё это нужно?Я еще могу пытаться телепатить, но заставить телепатить скрипт я не готов

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:14, 26-10-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление нежелательных символов из строки.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удаление строки из текстового файла Elven Скриптовые языки администрирования Windows 2 29-11-2013 17:44
CMD/BAT - удаление строки из файла HFShak Скриптовые языки администрирования Windows 5 05-11-2013 21:14
CMD/BAT - [решено] Вычитание символов из строки и вывод на экран Instant_SR Скриптовые языки администрирования Windows 4 25-07-2013 11:37
Вопрос - Удаление нежелательных драйверов и восстановление доступа к устройствам tovit Хочу все знать 14 29-01-2013 09:57
[решено] Удаление строки из файла gregaz AutoIt 2 16-07-2009 18:46




 
Переход