Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187

Фильтрация вводимой информации

02.01.2014, 10:37. Показов 4797. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите, пожалуйста, решение для следующей задачи.
Пользователю предлагается ввести строку, после чего строка проверяется, и если
в ней есть любые символы, кроме латиницы (без учета регистра), цифр и символа _
сообщается об ошибке ввода и предлагается ввести строку заново,
иначе - продолжается выполнение скрипта.
Получилось вот - за подсказку спасибо FraidZZ:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
chcp 866>nul
 
:Main
cls
set input=
set /p input="Введите имя (просто Enter - отмена операции): "
if %input%=="" exit /b
call :Validate "%input%" "code"
if !code! GTR 0 (
echo+ Имя должно содержать только символы латиницы и\или цифры
pause
goto :Main
)
echo %time:~0,8% - Идет работа
pause
goto :Main
 
:Validate [Входная строка] [Переменная для кода возврата]
set "string=%~1"
set err=0
echo.%string%|findstr /R /C:"[^a-z^A-Z^0-9^_]">nul&&set /a err+=2||set /a err-=1
echo.%string%|findstr /R /C:"[0-9_]">nul&&set /a err-=1
set "%~2=%err%"
exit /b
Вся конструкция падает при введении управляющих символов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.01.2014, 10:37
Ответы с готовыми решениями:

Контроль вводимой информации
Доброго времени суток. Имеется в наличии небольшой "батник", который выполняет действия архивирования\разархивирования. Суть в том, что...

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

Кодирование вводимой с клавиатуры информации
Вот расположил компонент RichEdit. Нужно сделать так, чтобы при вводе символов кириллицы с клавиатуры, после нажатия кнопки программа...

30
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
02.01.2014, 16:00
Bash
1
2
3
:Validate
echo."%~1"|findstr /V /R /C:"[^A-Za-z0-9_\"] >nul && set %~2=0 || set %~2=1
exit /b
Вот так

И в основном коде, 9 строка:
Bash
9
if "%input%"=="" exit /b
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
02.01.2014, 16:19  [ТС]
FraidZZ,
спасибо, все безупречно работает.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
02.01.2014, 16:31
@Root, хотелось бы дополнительно заметить, что после \"] еще одна кавычка не нужна. Такая вот странная особенность связки cmd + findstr
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
02.01.2014, 16:33  [ТС]
про findstr вообще много странных особенностей и откровенных багов. Пока искал как, много чего на форумах прочитал, как то про "особенную" работу с регулярными выражениями.
1
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
02.01.2014, 16:36
Цитата Сообщение от @Root Посмотреть сообщение
как то про "особенную" работу с регулярными выражениями.
Этим findstr славится... она не умеет выдавать точное вхождение регулярки и выдает всю строку
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.01.2014, 20:19
@Root, ох ничего себе генератор кода ошибки - 4 варианта О_о. Плюсую. Браво.
2
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
02.01.2014, 21:41  [ТС]
Dragokas,
кривой мой генератор.
Сейчас погонял в "боевых условиях" скрипт FraidZZ,
пришлось сделать так, иначе всегда ошибка:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
chcp 866>nul
 
:Main
cls
set input=
set /p input="Введите имя (просто Enter - отмена операции): "
if "%input%"=="" exit /b
call :Validate "%input%" "code"
rem echo !code!
if !code! GTR 0 (
echo+ Имя должно содержать только символы латиницы и\или цифры
rem pause
goto :Main
)
echo %time:~0,8% - Идет работа
pause
goto :Main
 
:Validate [Входная строка] [Переменная для кода возврата]
echo."%~1"|findstr /V /R /C:"[^A-Za-z0-9_\"]>nul&&set "%~2=0"||set "%~2=1"
exit /b
в функции Validate после set поставил кавычки "%~2=0"

Добавлено через 19 минут

Ничего не понимаю.
после нескольких прогонов скрипт стал "съедать" концевой %, после этого не работает как надо.
Например:
gffgdgfgdgdgfdh%
findstr всетаки "гуляет". Удалил кавычки, вроде все норм. До очередного концевого %.
"%" тоже прекрасно переваривает...

Можно ли решить задачу иначе?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.01.2014, 22:37
Вы % используете в имени файла?

Напишите, какие варианты имен Вы тестируете.
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
02.01.2014, 22:52  [ТС]
Dragokas,
нет, % нельзя.
я смотрю на все, что может ввести пользователь, чтобы избежать проблем с падением в дальнейшем.

Суть такая - латиница и/или цифирь и _ в любых сочетаниях и больше ничего. Потом надо будет еще на длину строки проверить (не более 15 символов) но это уже здесь решали.
Есть ли возможность через JS вставку, или только через VB.RegExp?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.01.2014, 23:15
%, как спецсимвол, всегда "глотается". С этим ничего не сделаешь.
JS-вставку бы неплохо. Да вот на языке JScript нет InputBox-a. Его Reg,Exp не даст результата, т.к. спецсимвол утеряется при передаче через аргумент.
Единственный вариант распаковывать код VBScript.
Ввод данных о имени файла делать через GUI-шное окно InputBox-a.
1
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
02.01.2014, 23:16
В JS есть регэкспы. Через JS можно просто чудненько решить. Но - я сейчас с планшета и код написать не могу.
Dragokas, в JS есть WScript.StdIn.ReadLine()
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
02.01.2014, 23:42  [ТС]
FraidZZ,
Dragokas,
заранее вам признателен и благодарен!
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.01.2014, 00:40
FraidZZ, даже так?
Вот, вроде разобрался. В JS RegExp-ы намного лаконичней.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@set @x=0; /*
@echo off
SetLocal EnableExtensions
chcp 866>nul
 
:Main
cls
set input=
set /p "x=Введите имя (просто Enter - отмена операции): "<NUL
For /F "delims=" %%a in ('cscript //E:JScript //nologo "%~f0"') do set "input=%%a"
if "%input%"=="" exit /b
if "%input%"=="/FAILURE/" (
  echo+ Имя должно содержать только символы латиницы и\или цифры
  pause
  goto Main
)
echo %time:~0,8% - Идет работа
pause
goto Main
 
*/var st = WScript.StdIn.ReadLine();
if (st.length == 0) WScript.Quit();
var patt=/[^a-z\d_]/i;
if (patt.test(st) == false) WScript.Echo(st); else WScript.Echo('/FAILURE/');
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
03.01.2014, 11:59  [ТС]
Dragokas,

Спасибо!

:::::::::::::::::::::::::::::::::::::::: :::::::::::::::

Dragokas,
оцените обертку на случай, если есть еще JS
например Ваша же (допиленная) MessageBox

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
@set @x=0; /*
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
chcp 866>nul
 
:Main
cls
echo+
echo+
set input=
set /p "x=Введите имя (просто Enter - отмена операции): "<NUL
 call :Validate "input"
if "%input%"=="" exit /b
if "%input%"=="/FAILURE/" (
call :MessageBox "Имя должно содержать только символы латиницы и\или цифры" "Ошибка проверки" OK 16
goto :Main
)
 
echo %time:~0,8% - Идет работа
pause
goto :Main
::
:Validate [Входная строка]
For /F "delims=" %%a in ('cscript //E:JScript //nologo "%~f0" "Validate"') do set "%~1=%%a"
exit /b
::
:MessageBox [Сообщение] [Заголовок] [Вид кнопок - YesNo или OK] [Critical - 16, Question - 32, Exclamation - 48, Information - 64]{noWait - опционально, чтобы не дожидаться нажатия ОК}
:: JS-имитация окна MSGBOX с возвратом кода ошибки при нажатой клавише: 0 - Нет, 1 - Да]
  if /i "%~3"=="YesNo" (set ButtonConst=4) else (set ButtonConst=0)
  set "infIcon=%~4"
  set /a ButtonConst=!ButtonConst!+!infIcon!
  if /i "%~5"=="noWait" (start "" /MIN cscript.exe //nologo //e:jscript "%~f0" "MessageBox" "%~1" "%~2" "%ButtonConst%"& exit /b)
  for /f %%a in ('cscript.exe //nologo //e:jscript "%~f0" "MessageBox" "%~1" "%~2" "%ButtonConst%"') do set msg_err=%%a
  set msg_retCode=0
  if "%msg_err%"=="6" set "msg_retCode=1"
  if "%msg_err%"=="7" set "msg_retCode=0"
exit /b %msg_retCode%
::
::
:: JS injection
::
::
 
*/try {
  var WSHShell = new ActiveXObject('WScript.Shell');
  var ShellApp = new ActiveXObject('Shell.Application');
 
  switch (WScript.Arguments(0)) {
    case "MessageBox": {
      WScript.Echo (WSHShell.Popup (WScript.Arguments(1).replace(/\\n/g,'\n'),-1,WScript.Arguments(2),+WScript.Arguments(3)));
      break;
    }
    case "Validate": {
      var st = WScript.StdIn.ReadLine();
      if (st.length == 0) WScript.Quit();
      var patt=/[^a-z\d_]/i;
      if (patt.test(st) == false) WScript.Echo(st); else WScript.Echo('/FAILURE/');
      break;
    }
  }
}
catch (e) { }
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.01.2014, 18:28
Цитата Сообщение от @Root Посмотреть сообщение
goto :Main
Согласно синтаксиса здесь : не нужно. Потом могут выплыть ошибки, даже если сейчас рабоатает.
Цитата Сообщение от @Root Посмотреть сообщение
EnableDelayedExpansion
Я убрал, чтобы ! не "глотало", но если в именах файлов они не нужны/не встречаются, пусть будет.

А так все клас.
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
03.01.2014, 18:46  [ТС]
Спасибо за комментарий!
Цитата Сообщение от Dragokas Посмотреть сообщение
Потом могут выплыть ошибки
можно подробнее? (если есть ссылка, то лучше ссылкой, чтобы тему не засорять)
Цитата Сообщение от Dragokas Посмотреть сообщение
чтобы ! не "глотало",
пусть глотает, все нормально.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.01.2014, 01:40
@Root, это так сразу ссылку не приведешь.
Но это факт. У тебя в маленьком батнике это будет работать.
Если проект чуть разрастеться, у CMD едет крыша, и начнет возникать ошибка "Не найдена метка пакетного файла" при текущем твоем синтаксисе.

Добавлено через 2 минуты
Я мог бы дать ссылку на ОСЗону, где я подымал этот вопрос, но это запрещено, да и ничего там особо нового не найдешь.
Самый основной хелп - это goto /?
Там и написано, как правильно.
1
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
04.01.2014, 01:48  [ТС]
Dragokas,
на данный момент в проекте 1061 строка (с комментами правда) ни разу не было такого.
В другом месте встречал, но там другой случай. При отсутствии : говорит, что "метка не является.... там чего-то", но отрабатывает, если ставишь : - вылетает с ошибкой синтаксиса.
Читал, что проблемы могут возникнуть, если пользоваться совместно с goto :EOF, я им не пользуюсь.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.01.2014, 08:13
Смотри
goto :eof - это служебная команда (здесь все правильно).
В остальных случаях только так:

Bash
1
2
goto metka
:metka
Добавлено через 1 минуту
Цитата Сообщение от @Root Посмотреть сообщение
на данный момент в проекте 1061 строка
Целеустремленно ))
Кстати, ссылка на проект, что ты давал, не открылась.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.01.2014, 08:13
Помогаю со студенческими работами здесь

Ограничение вводимой информации в TextBox
День добрый! Не подскажете как ограничить колличество символов вводимых в TextBox. Допустим 6 символов и только цифры. Это...

Ограничение вводимой информации в TextBox
есть код Private Sub TextBox18_Change() TextBox18.MaxLength = 3 If TextBox18.Text &lt;&gt; vbNullString Then TextBox18.Text =...

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

Отправка вводимой информации на email
Подскажите как написать код так чтобы человек ввел email и pass после нажатия кнопки START его email и pass отправились на почту пример...

проверка правильности вводимой информации
Автоматическая проверка правильности вводимой в форму информации. Пользователь вводит в текстовые поля данные для базы... как сделать эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru