использование специальных символов в параметрах и переменных в пакете без использования внешнего файла - PullRequest
0 голосов
/ 16 октября 2018

Прежде чем вы отметите это как дубликат, выслушайте меня

Мой вопрос;

A: имеет другие требования, чем все остальные (которые в основном "что такое escape-символ?")В том числе: отсутствие необходимости использовать внешний файл для ввода параметров в функции

B: ставит под сомнение существование этого беспорядка, вместо того, чтобы принимать «нет» или «его сложно» в качестве ответа

C: понимает, что уже существуют escape-персонажи и способы обойти это

D: приходит с другим уровнем квалификации и не является вопросом 2-7 лет

E: требуетсяиспользование кавычек, а не что-то вроде [потому что кавычки - это единственное, что работает с разнесенными строками

Кроме того, прежде чем вы скажете, что я не пробовал материал, который я прочитал (все это, включая комментарии и тому подобное):

Экранирование пакета символов

http://www.robvanderwoude.com/escapechars.php

https://blogs.msdn.microsoft.com/oldnewthing/20091029-00/?p=16213

с использованием пакетного эха со специальными символами

Снять угловые скобки в командной строке Windows

Пропустить, экранировать и распознать специальный символ в пакетном файле Windows

Я не совсем все понял, потому чточтобы полностью понять все, что я должен был бы быть намного лучше в партии, но вот что я почерпнул:

Итак, я понимаю, что есть целая таблица escape-последовательностей, которая наиболее часто используется ^, которую вы можетеиспользуйте Delayed Expansion для выполнения этой задачи, чтобы символы не анализировались сразу, а просто «расширялись» во время выполнения, но затем, что функция Enable Delayed extension не всегда работает, потому что с символами конвейера, другие файлы / вещи передаются по конвейеру.to / from не наследуют статус расширения, поэтому

A: вы должны включить его там тоже

B: что заставляет вас использовать это расширение

C: онотребуется несколько escape-символов для каждого прохода синтаксического анализа интерфейса командной строки, который, по-видимому, трудно определить и на что уродливо смотреть.

Все это выглядит довольно нелепо, почему не было какого-то рода создания, чтобы установить строку нечетных входных данных для литерала, а не обрабатывать символы.Почему это не был простой флаг на каком-то суперском пупер-специальном символе (думайте, что символ alt), который почти никогда не появится, если вы не установите шрифт для wingdings.Почему каждый разбор символов конвейера удаляет escape-символы?Это просто делает все безумным, потому что теперь пользователь должен знать, сколько раз эта строка используется.Почему не было разработано средство для автоматического сканирования нечетных входов и автоматического их выхода?У нас есть таблица правил, это действительно так сложно?Это уже сделано?Что бы это потребовало, это «трудно»?

Вниз по кроличьей норе мы идем

Как я сюда попал, спросите вы?Ну, все началось, когда я сделал простую функцию обрезки и столкнулся с одной из самых больших проблем в пакетном режиме, экранированием символов при получении входных данных.Проблема в том, что во многих моих входах в мою функцию обрезки были кавычки.Кавычки экранируются с помощью "" вместо ", поэтому что-то вроде

::SETUP
::parenthesis is just to deliniate where it goes, it isn't 
::actually in 
::the code
set "var=(stuff goes here)"
call :TrimFunc "%var%",var

:TrimFunc
::the + are just to display the spacing otherwise I can't tell
echo beginning param1 is +%~1+
::code goes here for func
gotoEOF

::END SETUP

::NOTE the + characters aren't part of the actual value, just the 
::display when I run this function

set "var=""a"""

::got +"a"+

будет работать, но

set "var="a " 

::got +"a+

::expected +"a +

set "var="a ""

::got +"a+

::expected +"a "+

set "var="a " "

::got +"a+

::expected +"a " +

set "var="a"

::got +"a",var+

::expected +"a+

не будет работать должным образом. Как ни странно,

set "var="a""

::got +"a"+

кажется, что работает, несмотря на то, что ему не удалось полностью избежать. Добавление пробелов, кажется, нарушает этот крайний случай.

Как ни странно, я пытался сделать:

set 'var="a"'

::got ++

::expected +"a"+

Но я понятия не имею, чтоизменение «на» на самом деле происходит, когда он содержит аргумент (а не те, которые должны быть буквальными).

Чтобы увидеть, что произойдет, и

Что я хочу:

Наверняка должна быть какая-то вещь универсального escape-символа, чтобы я мог сделать это (предположим, что специальный символ был *)

set *var=""something " "" " """*
call :TrimFunc "%var%",var
echo +%~1+

принесет мне

+""something " "" " """+

без проблем.На самом деле, почему у меня не может быть какого-нибудь универсального escape-символа, который можно просто использовать для буквального восприятия всех других символов внутри него вместо командной строки, пытающейся их обработать?Возможно, я думаю об этом неправильно, но это, кажется, повторяющаяся проблема со странными входами во всем.Я просто хочу, чтобы мои ремни, трубы и струны и все такое оставалось буквально, когда им предложили.Я просто хочу, чтобы у меня был какой-то ввод, а не какой-то странный вывод, он должен относиться ко всему буквально, пока я этого не хочу, потому что он был заключен в мистический суперспециальный персонаж, который я только что придумал.

::noob rant

Не понимаю, почему это никогда не было вещью.Что мешает создателям этого очень полезного языка просто создать флаг и какого-нибудь персонажа, который никогда не использовался как экранирующий символ высшего уровня.Зачем нам нужно 10 разных способов убежать от персонажей?Я должен иметь возможность программно избегать входных данных, если это необходимо, НИКОГДА не должно быть пользовательской задачей - избегать входных данных, что является абсолютно нелепым и, вероятно, нарушением любого существующего хорошего стандарта кодирования

::END noob rant

В любом случае.Я был бы счастлив узнать, почему вышесказанное является или не является вещью.Я просто хочу иметь возможность использовать кавычки в строке (довольно важно). И я не могу понять, почему это не так просто, как заставить одного гиганта «обращаться с этими вещами как с литералами», который ВСЕГДА JUST WORKS (тм).

Кстати, на случай, если вам интересно, почему моя функция берет имя переменной, в которую она записывает, я не мог понять, как заставить работать метки внутри меток без использования отложенного расширения.Использование этого означает, что переменная, которую я создаю, является локальной, а не глобальной, поэтому я использую имя глобальной переменной, чтобы в основном установить ее (используя ее имя) в локальное значение при возврате, например:

endlocal & set "%~2=%String%"

FeelВы можете кричать на меня по-разному, потому что я на 99% уверен, что я делаю что-то ужасно синтаксически неправильное, у меня есть какое-то плохое недопонимание или я просто наивен, чтобы по-настоящему понять всю сложность этой проблемы, но мне это кажется удивительно излишним.

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

, например,

set "var = "a" "

почему две заключительные кавычки не действуют специально, а промежуточные - буквально?Может ли CLI не сказать, где заканчивается строка?Разве он не может отличить первую и последнюю цитаты от промежуточных?Мне кажется, это просто реализовать.

Пока я могу правильно отображать вещи и сохранять их буквальное значение из параметра в переменную, я счастлив.

1 Ответ

0 голосов
/ 16 октября 2018

Во-первых, я не совсем понимаю, почему вы захотите использовать set "var=something" вместо set var=something, похоже, это не имеет значения.

Во-вторых, надеюсь, что это помогает, чтоЯ (недавно? IDK.) Изобрел метод для работы с назойливыми цитатами.Надеюсь, что эта партия вдохновляет или помогает вам делать что-то подобное.

@echo off
title check for length of string
color de
mode con: cols=90 lines=25
goto t

:t
set str=error
set /p str=Please enter four characters: 
set len=0
goto sl

:sl
call set this=%%str:~%len%%%
if not "%this%" == "" (set /a len+=1 & rem debug" == "" (set /a len+=1
goto sl)
if not "%len%" == "4" (set n= not) else (set n=)
echo This is%n% a four character string.
pause >nul
exit

Что в вашем случае:

if not "%var%" == "" (call :TrimFunc "%var%",var & rem debug" == "" (call :TrimFunc "%var%,var)
) 

Надеюсь, что это поможет.Добавить масло ~ (Мой компьютер не поддерживает задержку расширения по неизвестной причине. Поэтому большинство кодов немного неуклюжи.)


PS: если вы просто удаляете текст, а не заменяете текст, почемуне использовать set var=%var:string=%?Если требуемая строка тоже является переменной, вы можете попробовать это: call set var=%%var:%string%=%%

...