2014-11-27 4 views
0

나는 이것으로 머리를 쓰고있다. 이미 너무 많은 시간을 보냈다. 분명히 CMD 변수 등의 기본을 이해하지 못한다. 그리고 항상 나에게 그런 두통을 준다.루프 반복을위한 cmdlet onliner

왜 작동하지 않습니까?

for %a in (*) do (set tmpx=%a & echo %tmpx%)

는 위의 코드는 다른 범위 % tmpx %의 값을 출력 - 기본적으로 내가 간단한을 할 필요가

는 예, SETLOCAL ENABLEDELAYEDEXPANSION

을 실행 항상 일정 constantstring_somenameXX.tif에서 somenameXX.tif로 폴더의 모든 파일 이름 바꾸기, ie constantstring = 0000000005

다른 게시물이 올바르게 for a in lo를 제안했기 때문에 세트를 사용해야했습니다. op에는 특별한 동작이 있으며 대체는 그대로 작동하지 않습니다. 그들에게 불가능 사용하지 않는

당신에게

+0

[루프를 사용하여 파일 이름 바꾸기 일괄 처리] 가능한 복제본 (http://stackoverflow.com/questions/19453995/batch-rename-file-using-for-loop) – DavidPostill

답변

2
for %a in (*) do (set tmpx=%a & echo %tmpx%) 

이전 코드의 문제는 확장을 지연됩니다. 예, 활성화했으나 사용하지 않았고 활성화 된 방법에 따라 작동하지 않습니다.

cmd에서 라인 또는 블록 블록 (괄호 안의 코드)에 도달하면 처음입니다 파싱 ​​된 후 실행됩니다. 구문 분석 단계에서 변수 읽기 작업이 명령에서 제거되고 변수 의 값으로 바뀌기 전에 명령이 실행되기 시작합니다. 따라서 라인/블록 내부의 변수 값을 변경하면 동일한 라인/블록 내에서 변경된 값을 검색 할 수 없습니다 (바뀌 었음)

setlocal enabledelayedexpansion) 변수 읽기 구문은 %var%에서 !var!으로 파서에게 읽기 작업이 실행 단계까지 지연 될 것임을 나타냅니다.

따라서, 귀하의 경우, 코드는

setlocal enabledelayedexpansion & for %a in (*) do (set "tmpx=%a" & echo !tmpx!) 

같은 것을 했어야하지만 이것은 (기본 구성 환경에서) 작동하지 않습니다.

cmd에는 배치 파일과 명령 줄의 두 가지 실행 모드가 있습니다. 귀하의 경우에는 명령 줄 (for 루프에서 이스케이프 된 백분율 기호 없음)을 사용하고 명령 줄 모드에서 setlocal enabledelayedexpansion이 작동하지 않습니다. 배치 파일 용입니다 (setlocal /? 참조)

명령 줄에서 작동시키는 방법은 무엇입니까?기본적으로 cmd은 지연된 확장을 사용하지 않고 시작되며 배치 파일 내에 있지 않으면 활성화 할 수 없습니다. 하지만이 활성화 지연 확장을 cmd를 시작하고이 인스턴스를 시작 당신의 이름 바꾸기 문제를 해결하기 위해,

cmd /v:on /c "for %a in (*) do (set "tmpx=%a" & echo !tmpx!)" 

어쨌든 (cmd /? 참조) 명령을 실행할 수 있습니다, 지연 확장은

for %a in (*_*.tif) do for /f "tokens=1,* delims=_" %b in ("%~nxa") do echo ren "%a" "%c" 

을 즉 필요하지 않습니다 밑줄이있는 각각의 tif 파일에 대해 파일 이름 (%~nxa)을 문자열로 취하고 밑줄을 토큰 사이의 구분 기호로 사용하여 첫 번째 토큰 (첫 번째 밑줄의 왼쪽에있는 텍스트)을 검색합니다. %b 및 나머지 테 xt (밑줄의 오른쪽으로)를 %c에 입력하십시오. 이제 원래 파일 이름 (%a에 저장 됨)의 내용을 %c (밑줄 오른쪽 텍스트)의 이름으로 바꿉니다.

이 코드에서 이름 바꾸기 작업은 콘솔에만 표시됩니다. 출력이 올 바르면 echo 명령을 제거하십시오.

+0

인내심과 철저한 설명에 감사드립니다. cmd/k 및 cmd/x와 같은 옵션을 사용했지만 cmd /? 당신이 그것을 가능하게하는 방법을보기 위해서 - CMD/XP 명령의 불가사의 한 구문과 함께 희망을 넘어서 나를 좌절 시켰습니다. –

-1

감사 -

내가 스크립트 및/또는 PowerShell을 사용하지 않으려는 것입니다! 실행 시간 값을 원할 때 % 대신에 사용할 문자입니다. %는 읽은 값일 때 수행합니다.

CMD는 IBM 엔지니어가 작성했으며 Dos 명령이 동일하게 실행되도록하면서 MSDos를 프로그래밍 언어로 만들려고했습니다. 그래서 우리는 호지 podge를 얻는다.

& seperates commands on a line. 

&& executes this command only if previous command's errorlevel is 0. 

|| (not used above) executes this command only if previous command's errorlevel is NOT 0 

> output to a file 

>> append output to a file 

< input from a file 

| output of one command into the input of another command 

^ escapes any of the above, including itself, if needed to be passed to a program 

" parameters with spaces must be enclosed in quotes 

+ used with copy to concatinate files. E.G. copy file1+file2 newfile 

, used with copy to indicate missing parameters. This updates the files modified date. E.G. copy /b file1,, 

%variablename% a inbuilt or user set environmental variable 

!variablename! a user set environmental variable expanded at execution time, turned with SelLocal EnableDelayedExpansion command 

%<number> (%1) the nth command line parameter passed to a batch file. %0 is the batchfile's name. 

%* (%*) the entire command line. 

%<a letter> or %%<a letter> (%A or %%A) the variable in a for loop. Single % sign at command prompt and double % sign in a batch file.