2014-01-13 39 views
0

此问题的上下文是ImageMagick,但问题是一般的问题。windows批处理if语句只在​​一行上有效

我试图写一个批处理文件外壳,有条件地调用两个ImageMagick exe文件之一取决于安装(同一批处理文件可以在2个不同的PC上运行)。

我有壳批处理文件IM.BAT

if exist "C:\Program Files\ImageMagick-6.8.8-Q16\" "C:\Program Files\ImageMagick-6.8.8-Q16\Convert" %* 
if exist "C:\Program Files\ImageMagick-6.8.8-Q8\" "C:\Program Files\ImageMagick-6.8.8-Q8\Convert" %* 

,并从该文件MergeImages.BAT称之为:

: Use: call MergeImages <input file1> <input file2> <output file> 
: 
    call IM.bat^
    "%~1"^
    ^("%~2" -gravity center ^)^
    -composite^
    "png32:%~3" 

,并调用依次从TEST.BAT

call MergeImages.bat image1.png image2.png image3.png 

它全部按预期工作。然而,当我试图清理IM.BAT流:

if exist "C:\Program Files\ImageMagick-6.8.8-Q16\" (
    "C:\Program Files\ImageMagick-6.8.8-Q16\Convert" %* 
    goto :EOF 
) 
if exist "C:\Program Files\ImageMagick-6.8.8-Q8\" (
    "C:\Program Files\ImageMagick-6.8.8-Q8\Convert" %* 
    goto :EOF 
) 
echo Error: No executable found 

我得到的错误-composite was unexpected at this time。我确信错误来自批处理器而不是ImageMagick,可能是由于前一行使用了括号,但我不知道如何使其工作。任何指针赞赏。

回答

3

) in ^("%~2" -gravity center ^) ^提前关闭IM.BAT中的IF块。你目前所拥有的逃生没有做任何事情,因为它在IM.BAT可以看到之前被删除。另外,不需要开头(的逃脱。

有几个选项可以解决您的问题。

选项1:修改MergeImages.bat

: Use: call MergeImages <input file1> <input file2> <output file> 
: 
    call IM.bat^
    "%~1"^
    ("%~2" -gravity center ^^)^
    -composite^
    "png32:%~3" 

选项2:修改IM.BAT

if exist "C:\Program Files\ImageMagick-6.8.8-Q16\"^
    "C:\Program Files\ImageMagick-6.8.8-Q16\Convert" %* & goto :EOF 
if exist "C:\Program Files\ImageMagick-6.8.8-Q8\"^
    "C:\Program Files\ImageMagick-6.8.8-Q8\Convert" %* & goto :EOF 
echo Error: No executable found 

我不知道,但这些括号甚至需要?我从来没有在参数列表中看到像这样使用括号(我没有使用过ImageMagick)。我想知道如果MergeImages.bat可以如此简单:

: Use: call MergeImages <input file1> <input file2> <output file> 
: 
    call IM.bat^
    "%~1"^
    "%~2" -gravity center^
    -composite^
    "png32:%~3" 
+0

完美。选项1解决了这个问题,但是,在这种情况下,括号不是必需的,但它很好地知道如何在条件内处理它们(在ImageMagick括号中使用地点图像结果在堆栈中)。非常感谢您的全面回答。 – rossmcm