2012-10-18 4 views
1

프로그래밍 초보자입니다. 여기 내 딜레마가있다. 여러 대의 컴퓨터에서 여러 위치의 여러 파일을 대체해야합니다.for 루프를 사용하여 여러 데이터 입력

필자는 모든 변수를 정의하고 적절한 정보가있는 txt 파일을 호출하는 bat 스크립트를 작성했습니다. 예를 들어 -testing.txt는 값

있다
Apple, Potato,Beef 
Apple, Potato,Pork 

다음과 같이 내가 신청하는 논리는 : 나는 파일

set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin 
SET SORC=C:\tools\logosource\NEWImages\ApiSite\Content 

for /F "usebackq delims=, tokens=1-3" %%a in (C:\tools\xxxx\testing.txt) do (
SET HOSTNAME=%%a 
SET CUSTNAME=%%c 
SET STYPE=%%b 
SET DEST=\\%HOSTNAME%\c$\Documents and Settings\blahblah\My Documents\%CUSTNAME%\%STYPE%\goodman\ 

echo HOSTNAME is %HOSTNAME% 
echo CUSTNAME is %CUSTNAME% 
echo STYPE is %STYPE% 
echo DEST is %DEST% 
echo SORC is %SORC% 
) 

copy "%DEST%\ApiSite\Content\images\michael.gif" "%DEST%" 
copy /b /y "%SORC%\images\george.gif" "%DEST%\ApiSite\Content\images\michael.gif" 


goto End 

:Error 

ECHO Error! You must pass in a servername 
goto End 

:End 

을 변경하는 각 위치로 이동 한 후 읽기이 txt 파일을 사용하고 문제는 내 루프가 내 txt 파일의 마지막 줄만 읽는 것입니다. 즉. "Apple, Potato, Pork"라고 읽었고 그 값을 DEST로 설정합니다.

내가 정말로 원한다면이 매개 변수를 사용하여 DEST를 설정하고 파일을 변경 한 다음 다시 돌아가서 두 번째 줄 (Apple, Potato, Pork)을 읽고 DEST 이 매개 변수를 사용하고 파일을 변경하십시오.

답변

0

사실 코드가 파일의 모든 행을 읽고 있지만 논리가 잘못되었습니다.

주된 문제는 각 행에 대해 COPY 문을 수행하려고하지만 루프 외부에 COPY 문을 가지고 있기 때문입니다. 물론 그들은 한번만 실행될 것이고, 사용 된 값은 파일의 마지막 라인에 의해 설정된 값이 될 것입니다. 해결 방법은 COPY 문을 루프 내부로 이동하는 것입니다.

다른 문제는 괄호 안에 변수를 설정하고 %var%을 사용하여 값에 액세스하려고 시도하는 것입니다. 문이 구문 분석되고 모든 블록이 한 줄 전에 한 번 구문 분석 될 때 확장이 발생하기 때문에 작동하지 않습니다. 읽습니다. 지연된 확장을 사용하여이 문제를 해결할 수 있습니다 (지연된 확장에 대한 자세한 내용은 명령 행 프롬프트에서 HELP SET 입력). 그러나 변수에 값을 저장할 필요가 없습니다. FOR 변수를 직접 사용하기 만하면됩니다. DEST가 여러 번 사용 되었기 때문에 DEST 값이 포함 된 변수 %%d을 정의하기 위해 FOR 루프를 추가로 사용했습니다. ~은 FOR 루프가 추가 한 따옴표를 제거합니다.

또한 GOTO END을 사용하고 파일 끝에 :END 레이블을 지정하여 스크립트를 종료합니다. 그래도 작동하지만 모든 스크립트가 끝날 때 암시적인 :EOF 레이블이 있습니다. 레이블을 정의하지 않고 GOTO :EOF을 간단하게 사용할 수 있습니다. 다른 옵션을 사용하는 것입니다 EXIT /B

:ERROR 루틴이 호출되지 않습니다. 표시되지 않은 추가 코드가 있다고 생각합니다.

set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin 
SET "SORC=C:\tools\logosource\NEWImages\ApiSite\Content" 

for /F "usebackq delims=, tokens=1-3" %%a in (C:\tools\xxxx\testing.txt) do (
    for %%d in (
    "\\%%a\c$\Documents and Settings\blahblah\My Documents\%%b\%%b\goodman\" 
) do (
    echo HOSTNAME=%%a 
    echo CUSTNAME=%%c 
    echo STYPE=%%b 
    echo DEST=%%~d 
    echo SORC is %SORC% 
    copy "%%~d\ApiSite\Content\images\michael.gif" "%%~d" 
    copy /b /y "%SORC%\images\george.gif" "%%~d\ApiSite\Content\images\michael.gif" 
) 
) 
exit /b 

:Error 
ECHO Error! You must pass in a servername 
exit /b 
관련 문제