CMD/BAT - Как экранировать \

Ответить
Аватара пользователя
NikiWin

CMD/BAT - Как экранировать \

Сообщение NikiWin »

Добрый день. Попросили прикрутить утилиту. На вход она просит текст, при этом внутри она ищет \r\n и по ним разбивает строку на подстроки. Проблема в том что когда я ввожу в консоль текст с \r\n, она почему то его автоматически экранируются слешем(\\r\\n), в следствии чего программе не может получить подстроки. Кавычки одинарные и двойные не помогают, если сам экранирую и прямым и обратным слешем тоже не помогает. Подскажите пожалуйста как победить win консоль?
Аватара пользователя
Iska

Re: CMD/BAT - Как экранировать \

Сообщение Iska »

Цитата NikiWin:



Попросили прикрутить утилиту.
CMD/BAT - Как экранировать \




Где её взять? Приведите ссылку.




Цитата NikiWin:



Проблема в том что когда я ввожу в консоль текст с \r\n,
CMD/BAT - Как экранировать \




Покажите Ваш код. Продемонстрируйте, как вводите.



NikiWin, причём тут консоль? \r\n — это C.
Аватара пользователя
NikiWin

Re: CMD/BAT - Как экранировать \

Сообщение NikiWin »

К сожалению утилиту не могу выложить. Запускаю ее из консоли командой: C:\MyProg\prog.exe param1\r\nparam2. Загвоздка в том, что к строке vector vM = split(var[1], "\r\n") переменная var[1] имеет значение уже param1\\r\\nparam2. Изменить программу я не могу. Можно как-то запретить cmd менять \ на \\?
Аватара пользователя
Iska

Re: CMD/BAT - Как экранировать \

Сообщение Iska »

NikiWin, ещё раз: интерпретатор команд тут не при чём. Он ничего здесь не меняет. Можете взять Process Explorer и посмотреть, что приходит на вход утилите. Можете взять Process Monitor и убедиться и с его помощью.



Я не пойму: у Вас есть её исходный код? Откуда это:


Цитата NikiWin:



к строке vector vM = split(var[1], "\r\n") переменная var[1]
CMD/BAT - Как экранировать \




На чём она написана?
Аватара пользователя
NikiWin

Re: CMD/BAT - Как экранировать \

Сообщение NikiWin »

У меня есть ее исходный код, но я не могу ее менять. Написана она на С. Если посмотреть через Process Explorer то действительно, в командной строке везде по одному слешу выдает, но если сразу в main вывести argv то получим C:\\MyProg\\prog.exe в argv[0] и param1\\r\\nparam2 в argv[1].
Аватара пользователя
mwz

Re: CMD/BAT - Как экранировать \

Сообщение mwz »

Цитата NikiWin:



в командной строке везде по одному слешу выдает
CMD/BAT - Как экранировать \




Дурацкий вопрос... А если вообще без слэшей ввести?
Аватара пользователя
NikiWin

Re: CMD/BAT - Как экранировать \

Сообщение NikiWin »

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

[Расширение jpg было запрещено, вложение больше недоступно.]

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

Re: CMD/BAT - Как экранировать \

Сообщение Iska »

Цитата NikiWin:



Написана она на С.
CMD/BAT - Как экранировать \




На приведённом скриншоте вовсе не C.




Цитата mwz:



А если вообще без слэшей ввести?
CMD/BAT - Как экранировать \




Так и останется «rn».



NikiWin, вопрос упирается в конкретный язык и конкретный компилятор.





Скрытый текст

[spoiler]Код:
[/spoiler]

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

#include 
int main (int argc, char *argv[]) {
	int count;
	if (argc > 1) {
		for (count = 1; count < argc; count++) {
			printf("argv[%d] = %s\n", count, argv[count]);
		}
	} else {
		printf("The command had no other arguments.\n");
	}
	return 0;
}

Изображение
Аватара пользователя
NikiWin

Re: CMD/BAT - Как экранировать \

Сообщение NikiWin »

Используется Visual с++. Я проверил у меня тоже корректно выводит из приложения данные(с одним слешем), но именно в программе отладчик показывает два слеша и судя по работе split переменные внутри программы содержат два слеша.
Аватара пользователя
NikiWin

Re: CMD/BAT - Как экранировать \

Сообщение NikiWin »

Цитата NikiWin:



но именно в программе отладчик показывает два слеша
CMD/BAT - Как экранировать \




Вы пробовали посмотреть в отладчике именно argv[1], а не значение других переменных после присвоения? Я-то точно не буду загружать и устанавливать VC++ только из-за этого. Могу только сказать, что на шарпе (благо компилятор от него идёт в комплекте с .Net) этого также не происходит:



Скрытый текст

[spoiler]Код:
[/spoiler]

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

class CommandLine {
	static void Main(string[] args) {
		System.Console.WriteLine("parameter count = {0}", args.Length);
		for (int i = 0; i < args.Length; i++) {
			System.Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);
		}
	}
}

Изображение
Ответить

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