2013-02-22 12 views
1

我必须将UNIX Shell脚本转换为PowerShell脚本。该脚本在ImageMagick上运行转换。当我尝试执行以下代码:尝试访问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 ...)部分发生了同样的错误,我尝试查找如何转义parens,反斜杠(类似于Unix Shell代码)不起作用,字符也不起作用。

回答

2

当你调用调用-表达,字符串的内容传递在被视为一个PowerShell脚本表达。这意味着括号对的内容被视为脚本表达式。由于您使用的是双引号字符串 - “...”,因此在分配给$ convertcmd变量之前,反引号将被解释并删除。

您可以逃脱你的反引号,使他们在字符串中传递时要调用,表达仍然逃脱:

$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'" 
+0

谢谢!这是问题。 – 2013-02-22 20:31:56

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" 
+0

未能确定某些变量都应该看起来像,所以我做了一些东西了。 – mjolinor 2013-02-22 19:08:15

+0

谢谢,但它做同样的事情。问题是,Powershell使用parens来分组命令。 ImageMagick转换命令中的Parens意思是“......现在就这样做”,这样你就可以在一个命令中执行多个进程。 Powershell将parens内的内容视为不完整。对于Powershell,它看起来像没有命令的命令开关。 我已经试过逃离parens,但后来ImageMagick把它当作图像文件名的一部分,这是错误的。我可能只需要将每个转换过程分成它自己的命令。 – 2013-02-22 19:35:39

相关问题