在其中设置变量时,批处理功能外无可见性

时间:2012-06-12 05:09:15

标签: function batch-file cmd

我不知道这个批处理文件有什么问题:

@ECHO OFF
SET images=./images/
SET cdr=%CD%
SET result=noval

CD %images%
SET images=
:: Density
SET dpi=300

:: Process SVG
FOR %%x IN (%images%*.svg) DO (
  CALL:testFun %%~nx result
  echo res "%result%"
  IF [%result%]==[process] (
    ECHO Converting %%x
    inkscape -d %dpi% -A %images%%%~nx.pdf %images%%%x
  ) ELSE ( ECHO - Skiping %%x, file is uptodate.)
)

:: Process BMP, JPG, PNG, and TIFF
FOR %%x IN (%images%*.jpg,%images%*.bmp,%images%*.png,%images%*.tiff) DO (
  CALL:testFun %%~nx result
  echo res "%result%"
  IF [%result%]==[process] (
    ECHO Converting %%x
    inkscape -d %dpi% -A %images%%%~nx.pdf %images%%%x 
  ) ELSE ( ECHO - Skiping %%x, file is uptodate.)
)



:: Process EPS
FOR %%x IN (%images%*.eps) DO (
  CALL :testFun %%~nx result
  echo res "%result%"
  IF [%result%]==[process] (
    ECHO Converting %%x
    epstopdf --outfile=%images%%%~nx.pdf %images%%%x
  ) ELSE ( ECHO - Skiping %%x, file is uptodate.)
)

CD %cdr%
ECHO.&PAUSE&GOTO:EOF

::Functions

:testFun
SET "file=%1"
FOR /F %%f IN ('dir /Od /B "%file%.*"') DO (SET newest=%%~xf)
echo * Newest file for %file%: %newest%
IF [%newest%]==[.pdf] (echo noprocessing
GOTO :noprocess) ELSE (echo processing
GOTO :process)
:noprocess
SET result=noprocess
GOTO :endfun
:process
SET result=process
:endfun
GOTO:EOF

这个想法是它应该在目录中处理不同的图像,只有当图像(源)比结果PDF(输出)更新时。

然而,有几个问题我不知道它们为什么会发生。

  • 首先,第一个循环使用result的值并始终打印noval,看起来它正在跳过函数调用。但是,同样的调用方式适用于第二和第三循环。

  • 其次,在其他循环中(其中没有出现第一个问题),在函数内部更改的result的值不存在。喜欢的范围是不同的。但是,我将它用作全局变量,对吧?我使用set local测试此版本并将变量作为参考传递,但没有任何效果。

我在这里做错了什么或错过了什么?

1 个答案:

答案 0 :(得分:2)

代码按原样运行。您不知道的是{em}解析命令时cmd扩展了环境变量。在这种情况下,命令可以是包括块的完整for。因此在解析之后,其中没有变量,只有文本。这意味着如果您在块中更改变量并在同一块中使用它,您将看不到更改。

要解决此问题,您可以使用延迟扩展,以确保在运行单行(甚至在块中)之前直接扩展变量,从而缓解此问题。在批处理文件的顶部添加以下内容:

setlocal enabledelayedexpansion

然后使用!result!代替%result%来访问变量的值。