我想使用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成功解释?
答案 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"
解析非常棘手:|