|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление нежелательных символов из строки. |
|
|
CMD/BAT - [решено] Удаление нежелательных символов из строки.
|
Новый участник Сообщения: 24 |
Доброго времени суток уважаемые форумчане, в процессе написания батника возникла задача - очистить строки от нежелательных символов. Нежелательные символы, в идеале, это - !"№@#$^&*\|/?:%<~>` Частично проблема решается, но не со всеми символами прокатывает. Например &,%,<,>,| и " (двойная кавычка) ведут себя странновато. Подскажите способ их аккуратно извлечь и удалить не потеряв исходный текст, учитывая что строки читаются из файла, нельзя предугадать появление символов и нет возможности экранировать их в файле. Пример того что уже есть:
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 Возможно есть альтернативные решения... |
|
Отправлено: 16:36, 25-10-2018 |
Ветеран Сообщения: 2728
|
Профиль | Отправить 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата Amunrah:
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
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата megaloman:
|
||
Последний раз редактировалось Amunrah, 25-10-2018 в 20:29. Отправлено: 20:19, 25-10-2018 | #4 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
||
Отправлено: 20:56, 25-10-2018 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Amunrah, для каждой кодировки — свой подход нужен. А про пакетные файлы здесь вообще забудьте: только WSH или PowerShell.
|
Отправлено: 21:22, 25-10-2018 | #6 |
Ветеран Сообщения: 1274
|
Профиль | Отправить 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 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Amunrah,
Цитата Amunrah:
vbs в 1251 кодировке и текст в 866 кодировке тоже работают, но строку для замены пришлось подшаманить, чтобы № заменялся. Прикрепил к сообщению. (переименовал в txt). Если в Вашем тексте нет гос секретов и вмешательства в американские выборы, хотелось бы протестировать решения на Вашем реальном файле. И, однозначно, при разных кодировках файлов надо подбирать, как сохранить строку заменяемых символов - её кодировка должна совпадать с кодировкой файла. По видимому, корректнее задавать эту строку в виде массива кодов символов. |
|
------- Последний раз редактировалось megaloman, 26-10-2018 в 00:53. Отправлено: 00:36, 26-10-2018 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 06:31, 26-10-2018 | #9 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Iska, каждая задача должна иметь конечный смысл. Замена символов в файле - не конечная цель. Не может быть, чтобы на разных машинах файл для суперзадачи приходит в разных кодировках. Как не изгаляйся, останется вопрос: а зачем всё это нужно?Я еще могу пытаться телепатить, но заставить телепатить скрипт я не готов
|
------- Отправлено: 08:14, 26-10-2018 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|