У меня проблемы с экранированием символов в C# для запуска скриптов Powershell. Чтобы сделать проблему короткой. Я сделал следующий тест.
Я могу успешно выполнить следующую команду в Powershell ISE.
New-Issue -Summary "Test Summary" -Description "test `"test`" "
По сути, скрипт вставляет запись в таблицу базы данных. Таблица состоит из двух столбцов: сводка и описание. Значение для сводки - «Сводка теста», а значение для описания - «тест», тест ».
Я пытался запустить ту же команду Powershell в C#, выполнив следующее.
try{
command = "New-Issue -Summary \"Test Summary \" -Description \"test `\"test`\" \"";
powerShellInstance = PowerShell.Create();
powerShellInstance.AddScript(command);
Collection<PSObject> PSOutput = powerShellInstance.Invoke();
...
}
catch(Exception e)
{
return e.Message;
}
Я получил ошибку в C#. Ошибка не может быть перехвачена оператором try catch. Но я вижу исключения, сохраняемые в выходных данных в VisualStudio, код будет зависать там всегда:
Исключение: «System.Management.Automation.ParameterBindingException» в System.Management.Automation.dll Исключение: System.Management.Automation.ValidationMetadataException 'в Microsoft.PowerShell.Commands.Utility.dll Возникло исключение:' System.Management.Automation.ParameterBindingValidationException 'в System.Management.Automation.dll
Если описание не содержит двойные кавычки. Например,
command = "New-Issue -Summary \"Test Summary \" -Description \"test \"";
Скрипт отлично работает в C#. Я полагаю, что правильно избегаю двойных кавычек. Кто-нибудь знает, что здесь происходит не так?
Обратите внимание, этот пример только для демонстрации цели. Я знаю, что могу легко вставить данные в таблицу в C#. Я просто хочу выяснить, как правильно запускать скрипты Powershell в C#.
Спасибо.
PS: Я забыл упомянуть, что я предпочитаю использовать `чтобы избежать двойных кавычек, а не использовать одинарные кавычки в полях описания. Потому что значение для описания получается из текстового поля. Таким образом я могу обрабатывать только двойные кавычки из текстового поля и оставлять все как есть.