2016-08-12 2 views
1

배치 파일에서 여러 파일을 변수로 설정하는 방법에 대한 질문이 있습니까? 나는 아래 스크립트로 무엇인가하려한다.파일 이름을 배치 파일의 변수로 설정

move c:\*.gpg q:\ 
for %%F in ("q:\*.gpg") do (set file=%%~nxF) 
if exist q:\*.gpg echo done copying files: %file% 

위의 파일은 하나의 파일에서만 잘 동작한다. 3 개 이상인 경우에만 그 중 하나를 에코합니다. 복사 한 모든 파일을 한 줄에 어떻게 표시 할 수 있습니까?

+2

먼저해야 그룹 모두 당신의 명령 : 모두 각각'for' 반복에 의해 실행'set'와'같은 블록에 if'는 (할). 둘째, [Delayed Expansion] (http://ss64.com/nt/delayedexpansion.html) 문제 인 것 같습니다. [이 게시물] (http://stackoverflow.com/questions/10558316/example-of-delayed-expansion-in-batch-file) 또는 [this one] (http://stackoverflow.com/questions/22278456/)을 확인하십시오. 활성화 및 비활성화 지연 확장 - 할 일할 일) (또는 _Google_-ing에서 공개 한 수많은 사람들). – CristiFati

답변

1

는 아무것도하지 않고 그것을마다 덮어 쓰기 한 다음 변수 파일 각 루프에 새 값을 할당하고있어, 코드와

for %%F in ("q:\*.gpg") do (set file=%%~nxF) 
if exist q:\*.gpg echo done copying files: %file% 

우선 여러 문제가 있습니다. 따라서 루프 file은 마지막 루프의 값만 포함합니다. 루프 내에서 echo 부분을 대신 이동하십시오.

또 다른 문제점은 변수가 구문 분석시 기본적으로 확장된다는 것입니다. 당신이 file 변수가 파일 목록을 포함하도록 설정하면 다음에서 모든 파일을 에코하려면 당신은 런타임

Setlocal EnableDelayedExpansion 
for %%F in ("q:\*.gpg") do (
    set file=%%~nxF 
    echo done copying file: !file! 
) 

에서 확장 enable delayed expansion에 필요하게 대신 %!을 사용

for %%F in ("q:\*.gpg") do (
    set file=!file!, %%~nxF 
) 
echo done copying files: %file% 

존재하는 파일이 중복되어 있는지 확인하십시오. 이동 한 후에 종료 코드를 확인하고 파일이 이동되지 않은 경우 종료 할 수 있습니다.

0

변수가 일정하지 않으므로 확장 지연 변수를 활성화해야합니다. 여기서는 변수 file의 확장이 지연되어야합니다.

지연된 확장이 옵션은 SETLOCAL 명령으로 설정되어, 변수가 실행시보다는 구문 분석시에 확장하게됩니다. 지연 확장 효과 변수 인 경우

통상, FOR 루프가 전체 FOR 작업시 변수 확장 종종 유용 지연 (통상 %variable_name% 이외에) !variable_name!를 사용하여 참조 될 수있다 루프는 배치 스크립트의 여러 행에 걸쳐 있더라도 단일 명령으로 평가됩니다. 이것은 FOR 루프의 기본 동작입니다 :

예 :

@echo off 
setlocal 
:: count to 5 storing the results in a variable 
set _tst=0 
FOR /l %%G in (1,1,5) Do (echo [%_tst%] & set /a _tst+=1) 
echo Total = %_tst% 


C:\> demo_batch.cmd 
[0] 
[0] 
[0] 
[0] 
[0] 
Total = 5 

주의 그 FOR 루프 마감은 우리가 올바른 총을 얻을 수 있기 때문에 변수가 올바르게 증가하지만 루프의 반복마다 변수가 0의 초기 값에서 멈춤.

EnableDelayedExpansion와 같은 스크립트는 같은 최종 결과를 제공 할뿐만 아니라 중간 값을 표시

@echo off 
setlocal EnableDelayedExpansion 
:: count to 5 storing the results in a variable 
set _tst=0 
FOR /l %%G in (1,1,5) Do (echo [!_tst!] & set /a _tst+=1) 
echo Total = %_tst% 

C:\> demo_batch.cmd 
[0] 
[1] 
[2] 
[3] 
[4] 
Total = 5 

공지 사항을 그 루프에 대한 우리가 !variable! 대신 %variable%를 사용하여 내.

그리고 당신의 배치 스크립트는 그런 식으로 쓸 수있다 :

@echo off 
Set "Ext=*.gpg" 
set /a Count=0 
Setlocal EnableDelayedExpansion 
for %%F in ("q:\%Ext%") do (
    SET /a Count+=1 
    set "file=%%~nxF" 
    echo Done copying file [!Count!] : !file! 
) 
SET /a "COUNT_TOT=%Count%" 
ECHO. 
ECHO Total of [%EXT%] files(s) : %Count% file(s) 
pause 
관련 문제