6

Powershell 2.0 を使用して、Microsoft のマニフェスト生成および編集ツール (mage) を使用してアプリケーション マニフェストを作成するスクリプトを作成したいと考えています。具体的には、動的に指定されたパラメーター値を mage コマンドに渡すことができるようにしたいと考えています (たとえば、xml またはその他のソースから読み取る)。

これは、invoke-expression を使用して実現できますが、安全性の低いオプション (つまり、「powershell インジェクション攻撃」に対して脆弱) と見なされることは避けたいと思います。

これが私が知っていることです。

これは、「application.exe.manifest successfully created」というメッセージで成功します。

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

これは、「The first argument must be one of the following: -New, -Update, -Sign」というメッセージで成功しません (これは powershell ではなく mage のエラー メッセージです)。

$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配列として定義すると、配列項目ごとに1つのパラメーターを使用するのは簡単です。

# 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そして、パラメータ値のスペースを気にする必要はありません。パラメータ配列の値をそのまま使用します。余分なものは"必要ありません。

于 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

それはあなたが望んでいたものです。しかし、パラメータの 1 つに再びスペースがある場合は、もう一度引用符で囲む必要があります。

$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 に答える