2010-11-24 82 views
6

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

尽管我可以使用invoke-expression来实现这一点,但我宁愿避免它被认为是一个不太安全的选项(即容易受到“powershell注入攻击”的影响)。

这是我所知道的。

这与成功“application.exe.manifest成功创建”消息:

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

这并不消息“的第一个参数必须是下列之一成功: - 新, -Update,-Sign”(这是一个法师,而不是PowerShell中的错误消息):

$params = "-New Application" 

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

如何传递到$ params值的法师命令所以它成功地解释法师?

+1

真的是“PowerShell注入攻击”,来吧。你正在编写什么样的PowerShell管理脚本,将由其他管理员执行。 – 2010-11-25 02:37:33

回答

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.而且我们不必关心参数值中的空格,我们在参数数组中使用值,因为它们不需要额外的"

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" 

解析是非常棘手的: