Learner PS Ответов: 2

Экранирование амперсанда при выполнении скрипта


Я пытаюсь выполнить PowerShell из WPF, указав на powershell.exe путь. У меня есть следующий код
Ошибка, которую я получаю, заключается в том, что символ амперсанда (&) не разрешен. Оператор & зарезервирован для будущего использования; оберните амперсанд в двойные кавычки ("&"), чтобы передать его как часть строки.

Из любви к программному обеспечению: вызов сценария PowerShell в пути с пробелом из командной строки[^]

Мой сценарий выглядит следующим образом

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -Command "& 'c:\Test PS\Palindrome.ps1' -param Hello"


который отлично работает, когда я непосредственно копирую вставку в PowerShell, но не из приложения Win froms

Код для того же самого

ConsoleApplication2.rar -Google Диск[^]

Что я уже пробовал:

ProcessStartInfo proc = new ProcessStartInfo();
           string PSPath = string.Concat(Environment.SystemDirectory, "\\WindowsPowerShell\\v1.0\\powershell.exe");
           proc.FileName = PSPath;
           string DirectoryPath = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
           string script1 = string.Concat(DirectoryPath, "\\Palindrome.ps1 -param Hello");
           var match1 = Regex.Split(script1, @"(?<=\.ps1)\s+");
           string newfile1 = string.Concat("\"& '" + match1[0] + "'", " ", match1[1], "\"");
           string ScriptPath = string.Concat(PSPath, " -ExecutionPolicy Unrestricted -Command ");
           ScriptPath = string.Concat(ScriptPath, newfile1);

           //ScriptPath = string.Concat(ScriptPath, script);
           proc.Arguments = ScriptPath;
           using (Process p = new Process())
           {
               proc.Verb = "runas";
               proc.UseShellExecute = false;
               proc.RedirectStandardError = true;
               p.StartInfo = proc;
               p.Start();
               StreamReader myStreamReader = p.StandardError;
               p.WaitForExit();
               if (p.ExitCode != 0)
               {
                   MessageBox.Show(myStreamReader.ReadToEnd());
               }
           }

2 Ответов

Рейтинг:
2

OriginalGriff

Это потому что ваши сценарии не совпадают:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -Command "& 'c:\Test PS\Palindrome.ps1' -param Hello"
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -Command \&'D:\Documents\AA Backed Up\My Projects\GeneralTesting\GeneralTesting\bin\Debug\Palindrome.ps1' -param Hello"

Начните с замены этого " \ " двойной кавычкой и добавления пробела после амперсанда:
string newfile = string.Concat("\"& '" + match1[0] + "'", " ", match1[1], "\"");


Learner PS

Не повезло еще получить ту же проблему. Код для того же самого находится здесь http://www.c-sharpcorner.com/forums/uploadfile/2cd341/370588/Test_PS.rar

OriginalGriff

Если вы показываете нам именно то, что вы выполняете в командной строке, и это работает, то дважды проверьте строку в ScriptPath против строки - теперь она должна быть идентичной. Так что попробуйте удалить "C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" часть с фронта и передача останков в качестве параметров.

Learner PS

Код в моем решении такой же, как я только что обновил, но все еще не работает, можете ли вы мне помочь

Learner PS

Вот полный код https://drive.google.com/open?id=0B6o552kozQh4VkdMZ3M5TElvY1E

Michael_Davies

Попробуйте использовать &&, чтобы избежать &, не говоря, что это будет работать и ничего не нужно, чтобы проверить это, но стоит попробовать.

Learner PS

Не повезло, что он говорит, что токен && не является допустимым разделителем

Рейтинг:
0

demouser743

Попробуйте выполнить следующий код

string script1 = string.Concat(DirectoryPath, "\\Palindrome.ps1 -param Hello");
var match1 = Regex.Split(script1, @"(?<=\.ps1)\s+");
string ScriptPath = string.Concat(" -ExecutionPolicy Unrestricted -Command ", @"&'" + match1[0] + "'", " ", "" + match1[1] + "");
proc.Arguments = ScriptPath;