Слушатель сообщения расширения Chrome не работает

Проблема с цитированием командных строк для окон заключается в том, что на ваши кавычки воздействуют два многоуровневых синтаксического анализа. Сначала есть оболочка (например, cmd.exe), которая интерпретирует некоторые специальные символы. Затем вызывается вызванная программа, анализирующая командную строку. Это часто случается с функцией CommandLineToArgvW, предоставляемой Windows, но не всегда.

Тем не менее, для общего случая, например. используя cmd.exe с программой, анализирующей ее командную строку с помощью CommandLineToArgvW, вы можете использовать методы, описанные Daniel Colascione в . Все цитируют аргументы командной строки неправильным способом . Я изначально попытался адаптировать это к Ruby и теперь попытаюсь перевести это на python здесь.

import re

def escape_argument(arg):
    # Escape the argument for the cmd.exe shell.
    # See http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
    #
    # First we escape the quote chars to produce a argument suitable for
    # CommandLineToArgvW. We don't need to do this for simple arguments.

    if not arg or re.search(r'(["\s])', arg):
        arg = '"' + arg.replace('"', r'\"') + '"'

    return escape_for_cmd_exe(arg)

def escape_for_cmd_exe(arg):
    # Escape an argument string to be suitable to be passed to
    # cmd.exe on Windows
    #
    # This method takes an argument that is expected to already be properly
    # escaped for the receiving program to be properly parsed. This argument
    # will be further escaped to pass the interpolation performed by cmd.exe
    # unchanged.
    #
    # Any meta-characters will be escaped, removing the ability to e.g. use
    # redirects or variables.
    #
    # @param arg [String] a single command line argument to escape for cmd.exe
    # @return [String] an escaped string suitable to be passed as a program
    #   argument to cmd.exe

    meta_chars = '()%!^"<>&|'
    meta_re = re.compile('(' + '|'.join(re.escape(char) for char in list(meta_chars)) + ')')
    meta_map = { char: "^%s" % char for char in meta_chars }

    def escape_meta_chars(m):
        char = m.group(1)
        return meta_map[char]

    return meta_re.sub(escape_meta_chars, arg)

Применяя этот код, вы сможете успешно избежать своих параметров для оболочки cmd.exe.

print escape_argument('''some arg with spaces''')
# ^"some arg with spaces^"

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

import os

CMD = '''string with spaces and &weird^ charcters!'''
os.system('python -c "import sys; print(sys.argv[1])" {0}'.format(escape_argument(CMD)))
# string with spaces and &weird^ charcters!

0
задан Pranoy Sarkar 16 January 2019 в 10:34
поделиться