6

我想使用 Powershell 2.0 编写使用 Microsoft 的清单生成和编辑工具 (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 成功解释?

4

2 回答 2

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

This way is often overlooked but it is very handy, it allows easy dynamic composition of complex command lines for native applications.

P.S. And we do not have to care of spaces in parameter values, we use values in the parameter array as they are, no extra " needed.

于 2010-11-25T03:19:52.547 回答
3

启动过程

还有更多方法可以做到这一点。首先是通过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"

解析非常棘手:|

于 2010-11-24T21:28:04.517 回答