1

UNIX シェル スクリプトを PowerShell スクリプトに変換する必要があります。このスクリプトは、ImageMagick で変換を実行します。次のコードを実行しようとすると:

$convertcmd="convert $dir\tmpI.mpc `(-clone 0 $process `)`(-clone 0 -channel $color2 -separate -threshold $high% $tapering `) -compose over -composite `"$outfile`""

Invoke-Expression -Command $convertcmd 

私は得続けます

Invoke-Expression : Missing expression after unary operator '-'.
At C:\test\xxxxx.ps1:189 char:21
+             Invoke-Expression <<<<  -Command $convertcmd 
+ CategoryInfo          : ParserError: (-:String) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId :  MissingExpressionAfterOperator,Microsoft.PowerShell.Commands.InvokeExpressionCommand

$convertcmd がなる結果の文字列

convert .\COLORBALANCE\tmpI.mpc (-clone 0  -channel blue -level 0x98% +channel)(-clone 0 -channel blue -separate -threshold 18.9338% ) -compose over -composite /imagemagick/workarea/out/after.jpg

PowerGUI の intellisense としてのかっこは、ステートメントの (-clone... 部分で同じエラーを出すと思われます。かっこをエスケープする方法を調べてみましたが、バックスラッシュ (Unix シェル コードと同様) はありません。 t は機能しますが、` 文字でもありません。

4

2 に答える 2

2

Invoke-Expression を呼び出すと、渡す文字列の内容が Powershell スクリプト式として扱われます。これは、括弧のペアの内容がスクリプト式として扱われることを意味します。二重引用符で囲まれた文字列 "..." を使用しているため、$convertcmd 変数に割り当てる前にバッククォートが解釈されて削除されます。

Invoke-Expression に渡すときに文字列にエスケープされたままになるように、バッククォートをエスケープできます。

$convertcmd="convert $dir\tmpI.mpc ``(-clone 0 $process ``)``(-clone 0 -channel $color2 -separate -threshold $high% $tapering ``) -compose over -composite `"$outfile`""

または、変数に割り当てた後に括弧をエスケープできます。

$convertcmd="convert $dir\tmpI.mpc (-clone 0 $process ) (-clone 0 -channel $color2 -separate -threshold $high% $tapering ) -compose over -composite `"$outfile`""
$convertcmd = $convertcmd.Replace('(', '`(').Replace(')', '`)')
iex $convertcmd

または、コマンドをスクリプト ブロックで囲み、次のコマンドで実行できます&

 $convertcmd = {convert $dir\tmpI.mpc `(-clone 0 $process `)`(-clone 0 -channel $color2 -separate -threshold $high% $tapering `}
 & $convertcmd

Powershell v3 を使用している場合は、代わりに、コマンド--%の引数部分の前に置くことで、実行可能ファイル名の後の文字列全体をコマンド文字列として Powershell に解釈させることもできます。

$convertcmd="convert --% $dir\tmpI.mpc `(-clone 0 $process `)`(-clone 0 -channel $color2 -separate -threshold $high% $tapering `) -compose over -composite `"$outfile`""

または、Powershell のどのバージョンでも、cmd に文字列を解釈させることができます。

$convertcmd="convert $dir\tmpI.mpc `(-clone 0 $process `)`(-clone 0 -channel $color2 -separate -threshold $high% $tapering `) -compose over -composite `"$outfile`""
iex "cmd /c '$convertcmd'"
于 2013-02-22T19:21:25.057 に答える
0

これは役に立ちますか?

$dir = '.\COLORBALANCE'
$process = 'PROCESS'
$color2 = 'BLUE'
$high = '98'
$threshold = 'THRESHOLD'
$tapering = 'TAPERING'
$outfile = '/imagemagick/workarea/out/after.jpg'



$insert = @($dir,$process,$color2,$high,$tapering,$outfile)

$convertcmd= 'convert {0}\tmpI.mpc (-clone 0 {1} )(-clone 0 -channel {2} -separate -threshold {3}% {4} ) -compose over -composite "{5}"'


$convertcmd -f $insert

convert .\COLORBALANCE\tmpI.mpc (-clone 0 PROCESS )(-clone 0 -channel BLUE -separate -threshold 98% TAPERING ) -compose over -composite "/imagemagick/workarea/out/after.jpg"
于 2013-02-22T19:07:02.907 に答える