2011-11-20 2 views
1

이 만족 스럽도록 배치 파일을 만들고 싶습니다. 디렉토리에있는 모든 파일 이름의 긴 문자열. 파일 이름을 문자열로 병합하는 일괄 처리 파일이 작동하지 않습니다.

그래서 나는 디렉토리에 있습니다

-docA.pdf 
-docB.pdf 
-docC.pdf 

을 그리고 나는이 같은 문자열 갖고 싶어 : A의

docA.pdf의 docB.pdf의 docC.pdf

을 간단히 말하자면 : http://bit.ly/u1eAHO

도중 : 나는 스크립트

@echo off 
pushd "%~dp0" 
set "FILE_LIST=pre_" 

FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
     IF NOT %%i==%~nx0 (              
       echo %%i 

       set "FILE_LIST=%FILE_LIST%%%i" 
       echo %FILE_LIST%             
     ) 
    ) 

echo %FILE_LIST% 
pause 

를 썼다 그리고이 출력을 얻을 :

docA.pdf 
pre_ 

docB.pdf 
pre_ 

docC.pdf 
pre_ 

pre_docC.pdf 

왜? 어떻게 좋은 것을 얻을 수 있습니까?

답변

2

이것은 배치 파일의 꽤 잘 알려진 문제입니다. 짧은 대답은 배치 파일을 실행하기 전에 변수를 한 줄로 확장하여 배치 파일을 실행한다는 것입니다. 여러 줄 블록 (괄호 안의 내용)은 루프가 아닌 모든 변수를 한 번 확장 한 다음 루프를 실행합니다. 귀하의 루프 본문은 본질적으로 :

IF NOT %%i==%~nx0 (
    echo %%i 
    set "FILE_LIST=pre_%%i" 
    echo pre_ 
) 

그들은 어딘가에 레지스트리이나 SETLOCAL 문을 통해 활성화 할 수 있습니다 방법 (NT4 IIRC)를 따라 delayed expansion라는 기능을 추가했습니다. 스크립트를 다음과 같이 변경하십시오.

@echo off 
setlocal EnableDelayedExpansion EnableExtensions 
pushd "%~dp0" 
FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
    IF NOT %%i==%~nx0 (              
     set "FILE_LIST=!FILE_LIST!%%i" 
    ) 
) 
echo %FILE_LIST% 
endlocal 
pause 

으로 변경하십시오. 나는 월요일까지 내 윈도우 박스를 떠난다. 그러나 그것은 충분히 가깝다. 문제가 발생하면 명령 프롬프트에서 FOR /?SETLOCAL /?을 입력하여 표시된 도움말을 읽으십시오.

+0

댓글을 주셔서 감사합니다. 나는 그것이 문제를 해결할 것이라고 생각한다. 하지만 세상에, 오랜 세월을 바꿔야 했어. 그것은 간단하지 않습니다,하지만 난 아이디어를 얻을. 나는이 프로젝트로 돌아 가자 마자 시험 할 것이다. –

관련 문제