Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/48: Рейтинг темы: голосов - 48, средняя оценка - 4.88
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37

Как экранировать знак умножения в CMD?

05.10.2016, 01:34. Показов 10698. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане!
Имеется бинарник (app.exe) программы, написанной на C.
Допустим, что я хочу перемножить два числа в обратной записи, запуская программу и считывая арифметическое выражение из CMD. Например,
Windows Batch file
1
.\app 2 3 *
Как правильно экранировать знак умножения в CMD, чтобы выражение было корректным?

Добавлено через 4 часа 58 минут
На Linux это делается довольно-таки просто (\* — экранирование звёздочки):
Bash
1
2
nix@Nix:~$ ./app.out 2 3 4 + \*
14
Возможно ли что-то подобное сделать на Windows?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2016, 01:34
Ответы с готовыми решениями:

Как экранировать спецсимвол & ?
Как экранировать спецсимвол & ? всяко разно пробовал ничего не вышло..... Здесь смотрел и в интернете копалься тоже..... допусти...

Как написать cmd создающий другой cmd
Добрый день. Смысл в том, чтобы создать CMD с настройками текущего ПК: имя компьютера и имя пользователя, чтобы потом применить эти же...

Не работает знак умножения!
Здравствуйте! в самой последней функции U1s = 1\T программа выделяет красным букву s и выдает ошибку: Значение имеет единицы измерения...

14
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
05.10.2016, 01:57
supinf,
Например выполняя все это непосредственно с помощью cmd, мне не приходиться зачем-то думать об экранировании знака умножения:
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
call :l 2 3
pause>nul& exit
 
:l
if not "%*"=="" set /a przv=%1*%2
echo:Произведение равно: %przv%
exit /b
в параметрах передаю только оперируемые числа

Добавлено через 4 минуты
Более того, без проблем работает и такая конструкция:
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
call :l 2 * 3
pause>nul& exit
 
:l
if not "%*"=="" set /a przv=%1%2%3
echo:Произведение равно: %przv%
exit /b
.
1
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
05.10.2016, 02:45  [ТС]
Цитата Сообщение от alpap Посмотреть сообщение
выполняя все это непосредственно с помощью cmd, мне не приходиться зачем-то думать об экранировании знака умножения:
alpap, спасибо, но меня интересует именно кодирование на C, поэтому чистое использование CMD меня никак не устраивает.
Меня интересует что-нибудь из этой серии:
Windows Batch file
1
2
3
set /a tmp=3 4 5 + *
.\app %tmp%
12
Реально ли это (возможно, в другой форме)?
Может быть, команда есть для отключения функциональности звёздочки в CMD?

Добавлено через 25 минут
Открыл экранирование звёздочки методом тыка:
Windows Batch file
1
2
app 9 3 4 1 + *% *%
135
PS Не знаю, где про это написано в документации
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
05.10.2016, 06:24
Цитата Сообщение от supinf Посмотреть сообщение
интересует именно кодирование на C
В таком именно использовании, всё будет зависеть от самой программы, как она воспринимает параметры...
А вообще, в текстовом виде символ астериск не требует специального экранирования, за исключением тех случаев, где он целенаправленно используется в качестве спецсимвола:
run.bat (строка запуска: run.bat)
Windows Batch file
1
2
3
4
5
6
7
8
9
10
set a=*
echo %a%
 
call :t %a% *
pause&cls
call run_1.bat %a%
pause&exit
 
:t
echo %1 %2
run_1.bat
Windows Batch file
1
2
3
4
5
6
7
8
set b=%1
echo %b%
 
call :m %a% %b% *
pause&exit /b
 
:m
echo %1 %2 %3
Цитата Сообщение от supinf Посмотреть сообщение
set /a tmp=3 4 5 + *
А для cmd такая запись не имеет смысла, т.к. нарушены правила синтаксиса...
Её следует записать так:
Windows Batch file
1
2
set "tmp=3 4 5 + *"
app %tmp%
Если бы Вы привели более конкретный пример использования именно в cmd, тогда можно было бы, что-нибудь обдумать...

Цитата Сообщение от supinf Посмотреть сообщение
Открыл экранирование звёздочки методом тыка
А это называется самообман (по поводу открытия ). Вы просто не знаете/не помните, что символ "%" следует удваивать в сценариях, чтобы использовать в качестве именно текстового символа %, иначе интерпретатор его просто "съесть". Да и то, в некоторых случаях и удваивание этого символа используется в качестве спецсимволов... в общем, это cmd и в двух словах всего ведь не описать, поэтому нужны конкретности.
1
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
05.10.2016, 19:10  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
Если бы Вы привели более конкретный пример использования именно в cmd
Думаю, что в этом нет никакого смысла. Но моя идея такова (возможно, полностью бредовая, ибо я не думаю, что CMD обладает достаточным уровнем абстракции для этого):
Windows Batch file
1
2
3
4
set /a tmp="3 4 5 + *"
.\app %tmp%    /* здесь нужно к значению переменной %tmp% применить какой-нибудь eval, который 
                          раздербанит кавычки и защитит астериск от внешнего воздействия CMD :D */
12
PS Ну или ввести какие-нибудь коды в CMD для отключения его воздействия на астериск. В общем, я не знаю CMD, поэтому такие мысли почти бесполезны.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
05.10.2016, 21:52
supinf,
Вам уже объяснили, астерикс в cmd не требует экранирования, лучше поясните что вы хотите от cmd, по-отношению к вашему коду и не только.

Не по теме:

И чем так астерикс насолил



Добавлено через 4 минуты
Цитата Сообщение от supinf Посмотреть сообщение
меня интересует именно кодирование на C, поэтому чистое использование CMD меня никак не устраивает.
может стоит тогда выйти из cmd и прогуляться (безоглядно) прямиком в ветку C и иже?
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
05.10.2016, 22:26
Цитата Сообщение от supinf Посмотреть сообщение
set /a tmp="3 4 5 + *"
Тут вот как-то непонятно стремление записать в переменную значение вычисления совсем не математического выражения... просто-напросто, это не пропустит парсер. По поводу этого примера, я ведь написал выше, как это делается в cmd... Интерпретатор cmd считает параметры и передаст программе, а дальше уже, что делать с этими параметрами - забота Вашей программы.
В общем, чтобы решить задачу, её прежде необходимо правильно сформулировать, поэтому помочь Вам чем-либо пока трудновато, ибо непонятно, что же требуется получить в итоге.
0
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
05.10.2016, 22:41  [ТС]
Цитата Сообщение от alpap Посмотреть сообщение
Вам уже объяснили, астерикс в cmd не требует экранирования, лучше поясните что вы хотите от cmd, по-отношению к вашему коду и не только.
Во-первых, я не полностью понимаю этот пример, ибо знаком со скриптами CMD чуть менее, чем никак.
Во-вторых, я получил что хотел.
Ну, если вы хотите подробностей, то милости просим:
Моя программа считывает аргументы из CMD в массив char *argv[], если аргумент не число, то он проверяется на принадлежность к операторам с помощью условия в switch'e, например, case '*' (то есть оператор должен быть ASCII-символом с кодом, например, в восьмеричной системе \053), тогда pop() * pop().
Цитата Сообщение от alpap Посмотреть сообщение
И чем так астерикс насолил
Вообще-то ничем.

Не по теме:

Цитата Сообщение от alpap Посмотреть сообщение
может стоит тогда выйти из cmd и прогуляться (безоглядно) прямиком в ветку C и иже?
В таком случае я буду мыслить ещё шире и вообще откажусь от Windows, и перейду полностью, например, на Linux.



Добавлено через 9 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
Тут вот как-то непонятно стремление записать в переменную значение вычисления совсем не математического выражения...
Выражение, написанное обратной (постфиксной) польской записью — это математическое выражение. Ещё есть префиксная. Вы пользуетесь инфиксной, я полагаю.
Цитата Сообщение от YuS_2 Посмотреть сообщение
просто-напросто, это не пропустит парсер.
Но в строке пропустит. А из строки можно построить удобное ast-дерево для CMD. Но нужных функций в CMD, я так понимаю, нет.
Цитата Сообщение от YuS_2 Посмотреть сообщение
Интерпретатор cmd считает параметры и передаст программе, а дальше уже, что делать с этими параметрами - забота Вашей программы.
Конечно, почему-то с минусом, плюсом и делением всё в порядке.
Я думаю, что он интерпретирует "звездочку", как подстановочный символ (как в регулярных выражениях, например).
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
05.10.2016, 23:07
Цитата Сообщение от supinf Посмотреть сообщение
Выражение, написанное обратной (постфиксной) польской записью — это математическое выражение.
Только не для cmd. Чтобы получить подробности о команде "set /a ....", наберите "set /?"
Т.е. говоря иначе, такой записью Вы заставляете интерпретатор выполнять вычисление выражения и после чего записать его значение в переменную, но для него это вовсе не математика, поэтому Вы просто получите ошибку.

Цитата Сообщение от supinf Посмотреть сообщение
Вы пользуетесь инфиксной, я полагаю.
Я вообще не использую ничего, чтобы cmd выполнял вычисление. Это просто присвоение переменной строки символов. Вы вообще, приведенный выше пример запускали? Запустите и проанализируйте...

Цитата Сообщение от supinf Посмотреть сообщение
А из строки можно построить удобное ast-дерево для CMD.
Вы уточните, чего Вы хотите от cmd... абстракции ему точно недоступны

Цитата Сообщение от supinf Посмотреть сообщение
думаю, что он интерпретирует "звездочку", как подстановочный символ
Кто он? CMD передаёт астериск Вашей программе в качестве параметра, а вот как его воспринимает Ваша программа - это уже её проблема.

Windows Batch file
1
2
3
4
set "tmp=3 4 5 + *" &: здесь присваиваем строку переменной
echo %tmp% &: здесь проверяем, что записано в переменной...
rem Передаем значение переменной в качестве параметров программе:
app %tmp%
- Непонятно, что именно у Вас не работает?
0
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
05.10.2016, 23:35  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
Вы вообще, приведенный выше пример запускали? Запустите и проанализируйте...
Да, запускал. Но проанализировать плохо получилось (попробую ещё раз чуть позже).
Цитата Сообщение от YuS_2 Посмотреть сообщение
Кто он?
Интерпретатор CMD.
Цитата Сообщение от YuS_2 Посмотреть сообщение
CMD передаёт астериск Вашей программе в качестве параметра, а вот как его воспринимает Ваша программа - это уже её проблема.
Да, моя программа воспринимает астериск вот так: м■a
Поэтому я считаю, что CMD как-то искажает астериск, либо он как-то нестандартно представлен в CMD.
Цитата Сообщение от YuS_2 Посмотреть сообщение
- Непонятно, что именно у Вас не работает?
Всё работает. Просто я не могу понять, почему +, -, / представлены одинаково и в CMD, и в бинарнике моей программы; а астериски — по-разному.

Добавлено через 3 минуты
Меня интересует вопрос: как именно представлен астериск в CMD, и как можно изменить его представление в CMD, а не в моей программе.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.10.2016, 23:44
Лучший ответ Сообщение было отмечено supinf как решение

Решение

Так?
C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%i = %s\n", i, argv[i]);
 
    return 0;
}
Миниатюры
Как экранировать знак умножения в CMD?  
3
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
06.10.2016, 00:23  [ТС]
Dragokas, да, так. Оказалось, что дело в среде Code::Blocks 16.01 (возможно, включена какая-то опция в настройках компилятора GNU GCC или чего-то ещё, связанная с ASCII), в VS 2015 у меня тоже всё корректно работает. Хоть ваш ответ и отходит от первоначальной темы, но он реально лучший

Добавлено через 18 минут
Code::Blocks 16.01 вместо звёздочки выдаёт название файлов и папок, находящихся в директории проекта:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
1 = 2
2 = 3
3 = 4
4 = +
5 = bin    // название папки
6 = app.cbp
7 = app.10.depend
8 = app.layout
9 = main.c
10 = obj    // название папки
PS Т.е. астериск используется, как подстановочный символ. Буду благодарен, если кто-нибудь подскажет как это отключить в настройках Code::Blocks.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
06.10.2016, 00:33
Ну если прямо ответить, то есть разные правила передачи аргументов для:
1) из-под запущенного интерпретатора
2) из-под кода батника
3) просто в среде windows (через CreateProcess или ShellExecute)

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

При запуске программ из-под CMD, аргументы интерпретируются следующим образом:
Знаки |<>&^" - представляют из себя спец.символы, имеющие специальное значение.
Чтобы их передать как строковой литерал в качестве аргумента, нужно предварять знаком ^ (кроме каввычки).
Кавычка экранируется знаком \, то есть "

Из-под батника почти всё тоже самое, но ещё добавляется символ %
Чтобы экранировать, его следует удвоить %%
Ну ещё есть случай со знаком ! если в батнике включён режим EnableDelayedExpansion. Его экранируют через ^

Добавлено через 3 минуты
Ну и последний момент, |<>&^ можно экранировать, если заключить в кавычки.
Тоже самое касается знака "пробел". По-умолчанию, в Windows он служит разделителем аргументов. Даже если ввы укажите несколько подряд идущих символов пробела, система их не воспримет как очередной аргумент.

Добавлено через 2 минуты
Цитата Сообщение от supinf Посмотреть сообщение
Code::Blocks 16.01 вместо звёздочки выдаёт название файлов и папок, находящихся в директории проекта:
Весело
А код идентичен моему?
Цитата Сообщение от supinf Посмотреть сообщение
PS Т.е. астериск используется, как подстановочный символ. Буду благодарен, если кто-нибудь подскажет как это отключить в настройках Code::Blocks.
Лучше все-таки спросить в ветке по C++.
А потом скинете ссылочку, интересно что за "баг" -)
0
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
06.10.2016, 00:40  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
А код идентичен моему?
Именно ваш код я и запустил (ну, разве что, написал int i; вне цикла, ибо в старых стандартах C так точно не пишут). С такими же аргументами.
PS Собственно, про экранирование я прочитал в блоге у человека, который тоже запускал код со звёздочкой в Code::Blocks, но под Linux. Наверное, этот человек тоже не предполагал, что это всё Code::Blocks
0
 Аватар для supinf
10 / 10 / 6
Регистрация: 04.10.2016
Сообщений: 37
07.10.2016, 01:29  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Лучше все-таки спросить в ветке по C++.
А потом скинете ссылочку, интересно что за "баг" -)
Вопрос до сих пор остаётся открытым
Интерпретация астериска ("звёздочки") в Code::Blocks
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2016, 01:29
Помогаю со студенческими работами здесь

Найти знак умножения
Всем привет. У меня такая задача: Найти все строки в таблице, в которых есть хотя бы один знак произведения &quot;*&quot; Хочу...

Знак умножения, неправильный вывод
файлик ниже предоставил. не могу понять, почему $assa= round( ($sum / $sonfig_site), 2); $sum_payas=($proc*$assa); ...

Знак умножения в обработчике события
собственно компилятор ругается на любой знак умножения встречающися в коде выдает ошибку Unit1.cpp(28): E2087 Illegal use of pointer на...

Определить, между какими числами поставить знак умножения
Дано 7 рандомных цифр. Где поставить между ними знак умножения, чтобы при сложении остальных цифр и последующем умножении получить...

Как экранировать решётку?
Хочу написать скрипт для редактирования ссылок, но при редактировании ссылки #1111 получаю такую ошибку: Warning: preg_replace() : No...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru