Вызов программы из Powershell с очень длинным списком переменных аргументов? - PullRequest
4 голосов
/ 01 апреля 2011

В настоящее время я пытаюсь преобразовать серию пакетных файлов в сценарии powershell. Я хотел бы запустить компилятор для исходных файлов, которые существуют в каталоге, рекурсивно. Компилятору требуется длинный список аргументов. Суть в том, что я хочу, чтобы аргументы были переменными, чтобы я мог изменять их по мере необходимости. Это типичный вызов из командного файла (упрощенный для удобства чтения и длины):

"C: \ PICC Compilers \ picc18.exe" --pass1 "C: \ Src Files \ somefile.c" "-IC: \ Включить файлы" "-IC: \ Header Файлы "-P --runtime = по умолчанию, + ясно, + первонач, -keep + скачать + stackwarn, -config + CLIB, -plib --opt = по умолчанию, + asm, -speed, + пробел, 9 --warn = 0 --debugger = realice -Blarge --double = 24 --cp = 16 -g --asmlist "--errformat = Ошибка [ % n]% f;% l.% c % s "" --msgformat = Advisory [% n]% s "--OBJDIR =" C: \ Built Files " "--warnformat = Warning [% n]% f;% l.% c% s"

Эта команда выполняется нормально, когда включена в пакетный файл, но я начинаю получать ошибки, когда копирую и вставляю команду в powershell. Это только мой второй день работы с PowerShell, но я разрабатывал с .NET в прошлом. Мне удалось собрать следующую попытку:

$srcFiles = Get-ChildItem . -Recurse -Include "*.c"
    $srcFiles | % {
    $argList = "--pass1 " + $_.FullName;
    $argList += "-IC:\Include Files -IC:\Header Files -P --runtime=default,+clear,+init,-keep,+download,+stackwarn,-config,+clib,-plib --opt=default,+asm,-speed,+space,9 --warn=0 --debugger=realice -Blarge --double=24 --cp=16 -g --asmlist '--errformat=Error   [%n] %f; %l.%c %s' '--msgformat=Advisory[%n] %s' '--warnformat=Warning [%n] %f; %l.%c %s"
    $argList += "--OBJDIR=" + $_.DirectoryName;
    &"C:\PICC Compilers\picc18.exe" $argList }

Я знаю, что у меня, вероятно, есть несколько проблем с приведенным выше кодом, а именно, как передать аргументы и как я работаю с кавычками в списке аргументов. Неправильно, это должно иллюстрировать то, что я пытаюсь достигнуть. Любые предложения о том, с чего начать?

Ответы [ 2 ]

6 голосов
/ 01 апреля 2011

Вызов приложений командной строки из PowerShell может быть очень сложным. Несколько недель назад @Jaykul написал отличную запись в блоге Проблема с вызовом устаревших / нативных приложений из PowerShell , где он описывает ошибки, с которыми люди могут столкнуться в этих ситуациях. И конечно есть решение;)

edit - правильный URL

Эта статья больше недоступна, так что это можно увидеть только через web.archive.org - см. кэшированная статья

4 голосов
/ 01 апреля 2011

Сделать $arglist массивом вместо строки.Одна строка всегда будет передаваться как один аргумент, который вы не хотите здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...