我必须将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中作为intellisense的parens给了我同样的错误(-clone ...语句的一部分。我试过查找如何逃避parens和反斜杠(类似于Unix Shell代码) )不工作,也不是'字符。
答案 0 :(得分: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'"
答案 1 :(得分: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"