2012-06-12 2 views
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 (출력)보다 새로운 것입니다.

그러나 내가 왜 그런 일이 일어나고 있는지 알 수없는 몇 가지 문제가 있습니다. 우선

  • 는 상기 제 1 루프는 result 값 인쇄 noval 모든 시간을 사용하고,이 함수 호출을 건너 뛰는 것 같습니다. 그런 다음 동일한 호출 방법이 두 번째 및 세 번째 루프에서 작동합니다.

  • 두 번째, 함수 내에서 변경된 result의 값은 없습니다 (첫 번째 문제가 발생하지 않음). 범위가 다른 것과 같습니다. 그러나 전역 변수로 사용하고 있습니다. 나는 set local을 사용하여이 버전을 테스트하고 변수를 참조로 전달하지만 아무 것도 작동하지 않습니다.

내가 뭘 잘못하고있는 거지?

답변

2

코드가 제대로 실행됩니다. 무엇을 알지 못한다면 은 구문 분석시 명령을 사용할 때 환경 변수를 확장합니다. 이 경우 명령은 블록을 포함하는 완전한 for이 될 수 있습니다. 따라서 구문 분석을 한 후에는 텍스트 만 남습니다. 즉, 변수 블록으로 변경하고 블록을 사용하고 동일한 블록에 사용하면 변경 사항이 표시되지 않습니다.

이 문제를 해결하려면 변수가 블록 내 에서조차도 한 줄을 실행하기 전에 직접 확장되어이 문제를 완화 할 수 있도록 지연된 확장을 사용할 수 있습니다.

setlocal enabledelayedexpansion 

을 다음 변수 '값에 액세스 할 수 %result% 대신 !result!를 사용하여 배치 파일의 맨 위에 다음을 추가합니다.

관련 문제