Вызовите мага, используя Powershell 2.0, и вызовите оператор (т.е. &) - PullRequest
6 голосов
/ 24 ноября 2010

Я бы хотел использовать Powershell 2.0 для создания сценария создания манифеста приложения с помощью средства создания и редактирования манифеста Microsoft (mage).В частности, я хотел бы иметь возможность передавать динамически указанные значения параметров в команду mage (например, читать из xml или другого источника).

Хотя я могу сделать это с помощью выражения invoke, я бы предпочел избегатьэто рассматривается как менее безопасный вариант (т. е. уязвимый для «атак с использованием PowerShell»).

Вот что я знаю.

Это успешно выполняется с сообщением «application.exe».манифест успешно создан ":

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -New Application

Это не удается с сообщением" Первый аргумент должен быть одним из следующих: -New, -Update, -Sign "(который являетсямаг, не powershell, сообщение об ошибке):

$params = "-New Application"

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params

Как передать значение $ params команде mage, чтобы оно успешно интерпретировалось магом?

Ответы [ 2 ]

6 голосов
/ 25 ноября 2010

Это просто, если $params определен как массив, один параметр на элемент массива:

# define $params as an array
$params = "-New", "Application"

# and pass this array in, just as you tried before
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params

То же самое с $params, динамически встроенным в несколько шагов:

$params = @()
...
$params += '-New'
...
$params += 'Application'
...
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params

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

PS И нам не нужно заботиться о пробелах в значениях параметров, мы используем значения вмассив параметров, как они есть, никаких дополнительных " не требуется.

2 голосов
/ 25 ноября 2010

Запуск процесса

Есть и другие способы сделать это. Сначала через Start-Process:

$p = '-h 3 google.com'
start-process tracert -arg $p

Появляется новое окно. Если вы хотите запустить процесс внутри консоли, просто запустите его с -NoNewWindow

$p = '-h 3 google.com'
start-process tracert -arg $p -nonew

$params = "-New Application"
start-process "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -arg $params -nonew

Invoke-Expression

Invoke-Expression тоже может помочь. Но это сложно, потому что у вас есть пробелы на пути к вашему исполняемому файлу. Это работает, потому что в пути нет места:

$p = '-h 3 google.com'
invoke-expression "tracert $p"

Но если есть пробел, вам нужно использовать & внутри:

$params = "-New Application"
Invoke-Expression "& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params"

Обратите внимание, что "& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params" расширен до:

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -New Application

что ты и хотел. Но если в одном из параметров снова есть пробел, то снова .. вам нужно заключить его в кавычки:

$file1 = 'c:\test path\file1.txt'
$file2 = 'c:\test path\file2.txt'
$params = """$file1"" ""$file2"""
Invoke-Expression "& someexecutable $params"

Разбор довольно сложный: |

...