Как передать строковый параметр PowerShell, в котором есть `(обратный апостроф), ' и ' внутри?

Я выполняю сценарий Python с помощью команды PowerShell. Сценарий Python принимает строку, которая может содержать внутри себя специальные символы. Этот параметр передается из ansible конвейера. Ansible-хост — это машина Windows, поэтому нам нужно использовать модуль win_shell, который использует PowerShell. Таким образом, решение должно быть общим, которое можно применить к любой строке. Версия PowerShell, которую я использую, — PowerShell 5.1.

python.exe script.py --special_string the"str`in'g --otherparam value

Но это дает ошибки. (Просто «и» не пропускаются должным образом)

Основываясь на моих текущих выводах,

  • В PowerShell ' означает литеральную строку, а " можно использовать для добавления значений переменных.
  • В качестве escape-символа мы используем `, но``string`'g выдаёт ошибку. `"string`'g" тоже не работает. Ошибка в том, что PowerShell считает пропущенный ". Либо он принимает все оставшееся содержимое команды как содержимое строки, либо закрывает уже начатую строку с " в начале.
script.py: error: the following arguments are required: --otherparam
  • Вы не можете окружить строку с помощью ", например, "строка"g". Это тоже дает ошибку.
  • Обратную кавычку можно экранировать с помощью двойных обратных кавычек или заключить строку в одинарные кавычки. (сделав это буквальной строкой)

Как лучше всего это сделать?

«Но это выдает ошибки» какие ошибки вы получаете? Если вы запускаете скрипт Python с помощью python.exe, зачем вообще использовать powershell (в этом сценарии, вероятно, лучше использовать cmd)

Doug Maurer 30.05.2024 07:50

если вы не опубликуете ошибку, мы не сможем узнать, связана ли проблема с Powershell или Python.

sirtao 30.05.2024 08:05

Backtick — это escape-символ в PowerShell, поскольку в путях очень часто используется обратная косая черта.

js2010 30.05.2024 14:57
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
2
3
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

python.exe script.py --special_string "the`"str``in'g"

Да, это работает с точки зрения PowerShell. Но поскольку это передается в Python, он выдает ошибку с " внутри строки. Поэтому я сейчас тестирую и передачу \. Например, --special_string "the`"str``in'g"

Praveen Dinelka 31.05.2024 09:41

возможно "the`"str``in'g" ? Но это проблема Python, а не Powershell.

sirtao 31.05.2024 09:54

Да, похоже, что "the`"str``in'g" работает без проблем. Но необходимо убедиться, что правильная строка передается правильно, игнорируя escape-символы.

Praveen Dinelka 03.06.2024 05:05
Ответ принят как подходящий

Вы можете заставить PowerShell пропускать аргументы синтаксического анализа среды выполнения Python. Просто вставьте --% перед аргументами внешней команды python.exe:

python.exe --% script.py --special_string the"str`in'g --otherparam value

Он передаст аргументы как есть.

Спасибо! Это работает. И узнал токен остановки анализа (--%) не позволяет PowerShell интерпретировать строки как команды и выражения PowerShell. Это позволяет передавать эти строки в другие программы для интерпретации . Это устранило необходимость добавления escape-символов как в PowerShell, так и в Python. Теперь мне просто нужно добавить escape-символы Python, что намного проще.

Praveen Dinelka 03.06.2024 08:03

Другие вопросы по теме

New-AzAutomationSchedule — ссылка на объект не установлена ​​на экземпляр объекта
Как мне получить/создать WindowsIdentity для SID, используя .Net в PowerShell?
Скрипт Powershell, предназначенный для получения электронных писем всех пользователей и электронных писем менеджеров, принадлежащих к определенной группе безопасности в AD, создает пустой CSV-файл
Пользователи не могут пройти проверку подлинности в зоне доступности с помощью ConnectToAzure
Невозможно установить параметры в веб-перехватчике учетной записи автоматизации Azure в Powershell
Как запретить PsReadline добавлять «.exe» к исполняемым файлам, которые он предлагает при нажатии вкладки
Как получить дату из этой строки?
Передайте несколько переменных из функции для дальнейшего использования в скрипте
Преобразование массива хэш-таблиц туда и обратно с помощью JSON в Powershell 5.1
Powershell не может запустить Connect-AzAccount при открытии Powershell «от имени другого пользователя»