2015-07-11 2 views
2

Я пытаюсь проверить, цитируется ли строка, проверяя первый и последний символы строки. Но мой скрипт терпит неудачу при проверке котировки на выходе: И был неожиданным в это время. ниже.Проблемы с проверкой цитирования строки и добавлением котировок в строку

Код

@echo off 

set mystring=Non quoted string 

set myquotedstring=^"My quoted string^" 

echo mystring: %mystring% 

echo myquotedstring: %myquotedstring% 

set result=%mystring:~0,1% 

echo first character of non quoted string is: %result% 

set result=%mystring:~-1% 

echo last character of non quoted string is: %result% 

if %mystring:~0,1%u==^" AND %mystring:~-1%==^" (
    echo this string is NOT quoted 
    set newstring=^"Non quoted string^" 
    echo newstring: %newstring% 
) 

set result=%myquotedstring:~0,1% 

echo first character of quoted string is: %result% 

set result=%myquotedstring:~-1% 

echo last character of quoted string is: %result% 

if %myquotedstring:~0,1%u==^" AND %myquotedstring:~-1%==^" (
    echo this string is quoted 
) 

Это выход я получаю

mystring: Non quoted string 
myquotedstring: "My quoted string" 
first character of non quoted string is: N 
last character of non quoted string is: g 
this string is NOT quoted 
newstring: "Non quoted string" 
first character of quoted string is: " 
last character of quoted string is: " 
AND was unexpected at this time. 

UPDATE

Я понимаю, что теперь я не могу использовать AND. Но даже если я удалю, у меня проблема.

например

if %mystring:~0,1%u==^" if %myquotedstring:~-1%==^" (
    echo this string is NOT quoted 
    set newstring=^"Non quoted string^" 
    echo newstring: %newstring% 
) 

я

The syntax of the command is incorrect. 

ответ

0
@echo off 
setlocal EnableDelayedExpansion 

set mystring=Non quoted string 
echo %mystring% 
if !mystring:~0^,1!!mystring:~-1! equ "" (
    echo -^> String is quoted 
) else (
    echo -^> String not quoted 
    set newstring="%mystring%" 
    echo New string: !newstring! 
) 
echo/ 

set mystring="My quoted string" 
echo %mystring% 
if !mystring:~0^,1!!mystring:~-1! equ "" (
    echo -^> String is quoted 
) else (
    echo -^> String not quoted 
    set newstring="%mystring%" 
    echo New string: !newstring! 
) 
+0

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

+0

@Mofi: Очень легко изменить этот метод, чтобы искать одну цитату в начале или конце: 'set quote =" '-' ...) else if! Mystring: ~ 0 ^, 1! Equ! quote! ('-' echo - ^> Цитата в начале только '-' set newstring =% mystring% "' - ') else ...' – Aacini

+0

Правильно. Но однострочный 'set 'mystring ="% mystring: "=%" "' для получения значения переменной окружения всегда с окружающими кавычками, как я объяснил в моем отредактированном ответе, еще проще в использовании, чем любой IF ... ELSE. – Mofi

2

нет в партии нет AND. Использовать

if var1==value1 if var2==value2 echo both ok 

вместо этого.

3

Я исправил возникшую синтаксическую ошибку. Вероятно, это было из-за неправильной последовательности побега. Вы должны были использовать "" вместо ^" из-за этого documentation. Но для меня это тоже не сработало, мало что нужно делать с двойными кавычками.

Лично я заменяю "+ или каким-либо другим символом перед тем, как манипулировать строкой. Таким образом, этот фрагмент кода работает нормально:

set myquotedstring="My quoted string" 

set firstChar=%myquotedstring:~0,1% 
set lastChar=%myquotedstring:~-1% 

:: Replace " with + 
set firstChar=%firstChar:"=+% 
set lastChar=%lastChar:"=+% 

if "%firstChar%"=="+" if "%lastChar%"=="+" (
    echo "myquotedstring is quoted" 
) 
+1

Ваш ответ действительно работает. Windows cmd несколько хлопотно! –

-1

Почему вы хотите проверить, что строка цитируется и вообще добавить кавычки?

Почти всегда лучше иметь строки, присвоенные переменным окружения без кавычек, и использовать кавычки в пакетном файле, где это необходимо сделать при ссылке на переменную среды, но ссылаться на значение переменной среды без кавычек, когда это не нужно, как в a echo линия.

Пример:

@echo off 
setlocal EnableDelayedExpansion 
echo First argument without quotes is: %~1 
echo First argument with quotes is: "%~1" 
set "UserInput="" 
set /P "UserInput=Please enter something: " 
set "UserInput=!UserInput:"=!" 
echo User input without quotes is: %UserInput% 
echo User input with quotes is: "%UserInput%" 
endlocal 

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

Первый вывод - это первый аргумент, переданный пакетному файлу при вызове его без кавычек, если пакетный файл был вызван с 1 или более параметрами.

Объяснение для %~1 предоставляется командой . Вызов выполнен в окне командной строки с call /?.

Это просто показывает, как лучше всего обрабатывать аргументы командного файла.Аргументы группового файла всегда должны ссылаться на %~, и эта строка помещается в двойные кавычки, если это необходимо, например, когда аргумент является именем файла или каталога или строкой с пробелами или другими символами, требующими цитирования при передаче аргумента командного файла другим командам или приложениям ,

Символы, которые требуют строку в кавычки, перечислены в помощи CMD выхода на последней странице справки отображается с управлением cmd /? в окне командной строки.

Затем переменная окружения UserInput создается с присвоением переменной значения двойной стоимости в качестве значения по умолчанию.

Зачем использовать set "variable=value", например, here.

Пользователь пакетного файла может просто нажать клавишу RETURN вместо ввода строки в этом случае котировка остается назначенной переменным окружением UserInput. В противном случае строка, введенная пользователем, назначается UserInput.

В пакетном файле используется следующее замедленное расширение, чтобы удалить все кавычки из строки ввода пользователя. Именно по этой причине цитата была назначена как значение по умолчанию UserInput. Результат командного файла был бы неправильным, если бы пользователь просто ударил RETURN без ввода чего-либо без значения по умолчанию. Мне нравится использовать цитату в качестве значения по умолчанию, если пользователь должен ввести строку, как тогда я могу легко проверить после удаления кавычек, если пользователь вводил что-либо, кроме 1 или более кавычек. Конечно, иногда имеет смысл назначить значимое значение по умолчанию для предоставления пользователю возможности просто нажать клавишу RETURN, чтобы продолжить использование значения по умолчанию.

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

Это можно увидеть на входе, например !TEMP! как выход из пакетного файла является значение переменной окружения TEMP и не действительно Введенная строка. Поэтому в целом рекомендуется удалить все критические символы из строки, введенной пользователем, например < > ! %, таким же способом, как и для кавычек.

Наконец, таблицы переменной среды, содержащие теперь дополнительно UserInput удаляются, а переменная прежняя среда таблица восстановлена ​​с помощью команды endlocal, которые могут быть также опущены в конце пакетного файла, если этот пакетный файл никогда не вызываются из другого командного файла.

Пример с удалением также < и > и ! с пользовательского ввода.

@echo off 
setlocal EnableDelayedExpansion 
set "UserInput="" 
set /P "UserInput=Please enter something: " 
set "UserInput=!UserInput:"=!" 
set "UserInput=!UserInput:<=!" 
set "UserInput=!UserInput:>=!" 
set "UserInput=%UserInput:!=%" 
echo User input without quotes is: %UserInput% 
echo User input with quotes is: "%UserInput%" 
endlocal 

Для объяснения расширения переменной среды с задержкой открыть окно командной строки, выполнить там set /? и читать все справочные страницы вывода в окне консоли.


правка 2015-07-14:

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

Этот демонстрационный код демонстрирует этот Однострочник:

@echo off 
set "MyString=Non quoted string" 
echo Before: %MyString% 
set "MyString="%MyString:"=%"" 
echo After: %MyString% 

set MyString="Quoted string" 
echo Before: %MyString% 
set "MyString="%MyString:"=%"" 
echo After: %MyString% 

set "MyString="Single quote at begin" 
echo Before: %MyString% 
set "MyString="%MyString:"=%"" 
echo After: %MyString% 

set "MyString=Single quote at end"" 
echo Before: %MyString% 
set "MyString="%MyString:"=%"" 
echo After: %MyString% 

set "MyString=" 

Выход есть:

Before: Non quoted string 
After: "Non quoted string" 
Before: "Quoted string" 
After: "Quoted string" 
Before: "Single quote at begin 
After: "Single quote at begin" 
Before: Single quote at end" 
After: "Single quote at end" 

Это можно сделать даже без задержки с расширением, как это можно увидеть.

Нельзя использовать однострочный set "MyString="%MyString:"=%"", если значение переменной окружения может также содержать кавычки внутри строки, которые необходимо сохранить и не удалить.

Смежные вопросы