1

我必须将 UNIX Shell 脚本转换为 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 中的智能感知在 (-clone... 语句的一部分给我同样的错误。我尝试查找如何转义括号和反斜杠(类似于 Unix Shell 代码)不是' 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 回答