使用Powershell 2.0调用mage并调用运算符(即&)

时间:2010-11-24 19:56:39

标签: powershell clickonce mage

我想使用Powershell 2.0来编写使用Microsoft的Manifest Generation and Editing工具(mage)创建应用程序清单的脚本。具体来说,我希望能够将动态指定的参数值传递给mage命令(例如,从xml或其他来源读取)。

虽然我可以使用invoke-expression完成此操作,但我宁愿避免将其视为不太安全的选项(即容易受到“PowerShell注入攻击”)。

这就是我所知道的。

成功显示“application.exe.manifest已成功创建”消息:

& "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命令,以便mage成功解释?

2 个答案:

答案 0 :(得分:6)

$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

这种方式经常被忽略,但它非常方便,它允许为本机应用程序轻松动态组合复杂的命令行。

P.S。我们不必关心参数值中的空格,我们使用参数数组中的值,不需要额外的"

答案 1 :(得分:2)

开始进程

有更多方法可以做到这一点。首先是通过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也可以提供帮助。但它很棘手,因为在可执行文件的路径中有空格。这是有效的,因为路径中没有空格:

$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"

解析非常棘手:|