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

FOO /f "BAR ^"BAZ^""

Этот код не работает, потому что когда я избегаю кавычек, содержащих 'BAZ', он также избегает последней кавычки, потому что две кавычки рядом друг с другом будут экранированы в любом случае, даже если первая кавычка будет экранирована кареткой.

Я не хочу использовать что-то вроде sed, потому что я хочу, чтобы он строго использовал Windows Batch.

(РЕДАКТИРОВАТЬ: Вот команда, которая воспроизводит мою проблему:

REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /t REG_SZ /v Update /d "cmd.exe /c ""echo CreateObject(""Wscript.Shell"").Run """""""" ^& WScript.Arguments(0) ^& """""""", 0, False > invis.vbs && CALL invis.vbs update.bat""" /f

)

2 ответа2

2

Синтаксис источника : Escape-символы, разделители и кавычки

Особые случаи

Небольшое количество команд подчиняется немного другим правилам, FINDSTR, REG и RUNAS все используют \ как escape-символ вместо ^

Вы использовали:

REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR ^"BAZ^"" /f

Попробуйте это вместо этого:

REG ADD <KEYNAME> /t REG_SZ /v FOO /d "BAR \"BAZ\"" /f
2

Я написал небольшую программу на C чтобы узнать, что на самом деле передается из cmd.exe

#include "stdafx.h"

int main(int argc, char **argv)
{
    for (int i = 0; i < argc; i++)
    {
        printf("\n%d: '%s'\n", i, argv[i] ? argv[i] : "<null>");
    }
    return 0;
}

Вызов:

consoleapplication1 ADD KEYNAME /t REG_SZ /v FOO /d "BAR ""BAZ""" /f

Параметры поступили в программу:

0: 'consoleapplication1'

1: 'ADD'

2: 'KEYNAME'

3: '/t'

4: 'REG_SZ'

5: '/v'

6: 'FOO'

7: '/d'

8: 'BAR "BAZ"'

9: '/f'

Одиночные кавычки просто добавлены в целях иллюстрации.

Нижняя линия:
Двойные двойные кавычки работают как положено.

Замечания:
REG использует обратную косую черту в качестве специального escape-символа, как описано здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .