2008-10-31 4 views
8

이것은 바보 같지만 작동시키지 못합니다. 난 그냥 '그나마 여기 %%v, %v% and %vfor 루프의 변수에 대해 문자열 연산을 수행하려면 어떻게합니까?

의 차이를 이해 내가 할 노력하고있어 생각 :이 성공적으로 영화의 각 썸네일을 생성

for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%v.jpg" 

을하지만 문제는 다음과 같습니다

movie.flv -> movie.flv.jpg 

그래서 내가하고 싶은 것은 %%v에서 마지막 4 문자를 꺼내 두 번째 변수에 사용하는 것입니다.

%%v:~0,-3% 

을하지만 그것은 작동하지 않으며, 내가 생각할 수있는 그의 반복 중입니다

나는이 같은 일을 시도했습니다.

아이디어가 있으십니까?

+0

한 줄에 "set"과 "echo"가있는 경우 FOR 루프 : nslookup -vc -type = TXT twitter.com 8.8.8.8 | 찾기 "" ""|/f "tokens = *"% f in ('findstr $') do @ (echo | set/P str = % f) – diyism

답변

8

파일 이름 만 가져 오려면 %% ~ nV를 사용하십시오. "에 대한 도움말"에서

+0

"n"은 무엇을 의미합니까? – UltimateBrent

+0

그게 효과가! 나는 왜 그랬는지 이해하지 못합니다 ... – UltimateBrent

+1

"help for"참조 : 또한 FOR 변수 참조 대체가 향상되었습니다. 이제 다음과 같은 옵션 구문을 사용할 수 있습니다 : %가 ~ I - 나는 어떤 주변 따옴표 (")를 제거 %를 확장 ... %가 ~ NI는 - 만 ... – WPWoodJr

8
for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%~nv.jpg" 

:

%~I   - expands %I removing any surrounding quotes (") 
%~fI  - expands %I to a fully qualified path name 
%~dI  - expands %I to a drive letter only 
%~pI  - expands %I to a path only 
%~nI  - expands %I to a file name only 
%~xI  - expands %I to a file extension only 
%~sI  - expanded path contains short names only 
%~aI  - expands %I to file attributes of file 
%~tI  - expands %I to date/time of file 
%~zI  - expands %I to size of file 
%~$PATH:I - searches the directories listed in the PATH 
       environment variable and expands %I to the 
       fully qualified name of the first one found. 
       If the environment variable name is not 
       defined or the file is not found by the 
       search, then this modifier expands to the 
       empty string 
+0

감사 파일 이름으로 % I을 확장 설명! – UltimateBrent

2

나는 위의 (나는 WSH 나 대신 다른 스크립트 언어를 사용)하지만 난 시도하고 %% 브이 %를 설명 할 수있는 등의 배치에 좋은 아니에요 v % v %.

처음 두 양식은 루프 for에 사용됩니다. help for은 차이점을 설명합니다. 첫 번째 양식은 배치 파일에서 사용되고 두 번째 양식은 명령 프롬프트에서 직접 입력 (붙여 넣기) 할 때 사용됩니다.

마지막 형태는 그 값으로 변수 이름 (환경 변수)를 대체 : 사실에 대한 루프 변수에 문자열 연산을 수행하는 방법을 찾고이 스레드를 발견 사람들을 위해

set FOO=C:\bar\foo 
cd %FOO%\gah 
25

이 (delayed expansion를 사용)를 :

setlocal enabledelayedexpansion 

... 

::Replace "12345" with "abcde" 
for %%i in (*.txt) do (
    set temp=%%i 
    echo !temp:12345=abcde! 
) 
+0

작품, 고마워요! –

+7

echo 대신에 비교하기를 원한다면, 대체와 같은 행에서 할 수 없다. 다시 예를 들어서 사용해야한다. (파일에 "thirdparty"스크립트가 들어 있는지 확인하기) : set file = %% i \ n SET 파일 =! file : thirdparty =! \ n IF %% f ==! file! –

0

아직 I 선호하는 또 다른 방법으로 만들 수있는 서브 루틴 (: processMpeg) I는 for 루프의 각 요소를 요구하는 I가 %% 브이 변수를 전달하는 것이다.

for %%v in (*.flv) do call :processMpeg "%%v" 
goto :eof 

:processMpeg 
    set fileName=%~n1 
    echo P1=%1 fileName=%fileName% fullpath=%~dpnx1 
    ffmpeg.exe -i "%~1" -y -f mjpeg -ss 0.001 -vframes 1 -an "%filename%.jpg" 
    goto :eof 
관련 문제