1

このバッチファイルの問題はわかりません。

@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とprintを使用しnovalており、関数呼び出しをスキップしているように見えます。ただし、2番目と3番目のループでも同じ呼び出し方法が機能します。

  • 次に、他のループ(最初の問題が発生しない)ではresult、関数内で変更されたの値がありません。スコープが違うように。しかし、私はそれをグローバル変数として使用していますよね?set local変数を参照として使用してこのバージョンをテストしましたが、何も機能しません。

私がここで間違っていることや行方不明になっていることは何ですか?

4

1 に答える 1

3

コードは正常に実行されます。あなたが気付いていないのは、コマンドを解析cmdするときに環境変数を拡張することです。この場合のコマンドは、ブロックを含めて完全にすることができます。したがって、解析後、変数は残りません。テキストのみが残ります。つまり、ブロック内の変数を変更し同じブロックで使用した場合、変更は表示されません。for

これを解決するには、遅延展開を使用して、単一行を実行する直前に変数が展開されるようにし(ブロック内であっても)、この問題を軽減します。バッチファイルの先頭に次を追加します。

setlocal enabledelayedexpansion

次に、!result!の代わりに%result%を使用して変数の値にアクセスします。

于 2012-06-12T05:18:05.760 に答える