1

Тема: CMD/BAT Возможно ли передать символ ^ в строке аргументов?

Код пакетника 1:

@echo off
echo 1: argument _%1_
call 2.bat %1
@echo off
echo 2: argument _%1_

1) Передаем простую строчку:
1.bat 123-abc
Выдает:
1: argument _123-abc_
2: argument _123-abc_

Все замечательно.

2) Передаем строчку, содержащую символ ^:
1.bat 123^abc
Съедает символ на первом же пакетнике:
1: argument _123abc_
2: argument _123abc_

3) Передаем строчку с удвоенным ^^:
1.bat 123^^abc
Съедает.
1: argument _123abc_
2: argument _123abc_

4) Не сдаемся, передаем с учетверенным ^:
1.bat 123^^^^abc
Хм, оставляет один символ из 4-х:
1: argument _123^abc_
2: argument _123abc_

5) Увеличиваем дальше. Любопытные изменения происходят при 8-ми ^:
1.bat 123^^^^^^^^abc

1: argument _123^^abc_
2: argument _123^abc_

Из чего делаем вывод, что символ-таки передается в обоих пакетниках и при меньшем количестве, просто "с трудом" отображается.

6) Продолжаем эксперименты. Оборачиваем аргумент в кавычки:
1.bat "123^^abc"

1: argument _"123^^abc"_
2: argument _"123^^^^abc"_

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

Что можно сделать для стабилизации передачи "крышечки" в аргументах пакетников?

Я знаю, что ^ используется в пакетниках и в командной строке как символ экранирования. Собственно и не удивляюсь такому поведению, но вдруг есть способ его обуздать?

2

Re: CMD/BAT Возможно ли передать символ ^ в строке аргументов?

Решается обрамлением параметра запуска в кавычки  и обрезанием оных при получении скриптом.

1:

@echo off
echo 1: argument "%~1"
call 2.bat "%~1"

2:

@echo off
echo 2: argument %~1
Output пишет:

>1.bat "1^ 2^^ 3^^^"
1: argument "1^ 2^^ 3^^^"
2: argument 1^ 2^^ 3^^^

В общем вся суть в %~1.
А так как Вы собираетесь использовать это для именен файлов или папок, то для исключения пробелов во втором скрипте рекомендую использовать короткие пути (%~s1).

3

Re: CMD/BAT Возможно ли передать символ ^ в строке аргументов?

Спасибо за идею!

Передачу аргумента с ^ получилось стабилизировать следующим путем:

1.bat

@echo off
rem Variant 1 Strip'n'back
echo 1: "%~1"
call 2.bat "%~1"
echo.
rem Variant 2 Simple'n'lazy :)
echo 0: %1
call 2.bat %1

2.bat (в периоде)

@echo off
echo 2: ^"%~1^"
call 3.bat ^"%~1^"

3.bat (аналогично 2.bat)

@echo off
echo 3: ^"%~1^"

Таким образом, для успешной передачи требуется:
1) Обеспечить передачу аргумента первому и любому последующему пакетнику обязательно в кавычках.
2) В первом пакетнике раскавычить (%~1) аргумент и вновь прилепить кавычки ИЛИ обращаться с аргументом как есть.
3) В последующих пакетниках раскавычивать аргумент, и при выводе или дальнейшей передаче добавлять кавычки экранируя их крышечкой (^"), так чтобы они с одной стороны были, но с другой обработчик не решил бы из-за их наличия чего-то менять в аргументе.

Итого:
1.bat "123^ abc ^^def^"

1: "123^ abc ^^def^"
2: "123^ abc ^^def^"
3: "123^ abc ^^def^"

0: "123^ abc ^^def^"
2: "123^ abc ^^def^"
3: "123^ abc ^^def^"

4 (изменено: jite, 2011-03-29 00:07:41)

Re: CMD/BAT Возможно ли передать символ ^ в строке аргументов?

Не так уж все и хорошо с таким решением, как оказалось.

При обращении с полученными аргументами между экранированными кавычками (^"), например:

1.bat "чего-то там (внезапно скобочки или вот такие значки && текст)"

содержимое аргумента начинает восприниматься как часть синтаксиса ну и соответственно вызывать ошибки. Своеобразные "инъекции" получаются.


Отказался от использования методики, реализовал все на jscript. Там, кстати, тоже стоит все аргументы для передачи скрипту, в которых могут оказаться "крышечки" и пр., обрамлять кавычками, тогда никакие символы не пропадут.

5

Re: CMD/BAT Возможно ли передать символ ^ в строке аргументов?

передача в кавычках

@echo off

set "x=%~1"

echo "%x%"

set "x=%x:^=^^%"

echo %x%
Я конечно далек от мысли... (с)

6

Re: CMD/BAT Возможно ли передать символ ^ в строке аргументов?

Нужна помощь с созданием батника и выводом их него в командной строке надписи со знаком восклицания.

>>"Inst.cmd" Echo ECHO                       Внимание^^!

получается Inst.cmd

ECHO                       Внимание!

в командной строке слово Внимание получается без знака восклицания. Эксперименты с увеличением ^^^ проглатывают знак восклицания в Inst.cmd. Хелп!