배치 : 파일 확장자 제거


155

Wikipedia의 다음 배치 스크립트가 있습니다.

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

for 루프에서 확장자가 flv 인 모든 파일이 에코되지만 확장자가없는 파일과 확장자가있는 파일이 필요한 파일로 일부 작업을 수행하려고합니다. 이 두 가지를 어떻게 얻을 수 있습니까?

솔루션을 검색했지만 찾지 못했습니다. 나는 배치의 진정한 초보자입니다 ...

답변:


309

%%~nf에 대한 참조에 설명 된 대로만 파일 이름을 얻는 데 사용할 수 있습니다 for.

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf
)
pause

다음과 같은 옵션을 사용할 수 있습니다.

수정 자 설명이있는 변수

% ~ I ​​주변을 제거하는 % I를 확장합니다 
                        인용 부호 ("").
% ~ fI % I을 완전한 경로 이름으로 확장합니다.
% ~ dI % I을 드라이브 문자로만 확장합니다.
% ~ pI % I를 경로로만 확장합니다.
% ~ nI % I을 파일 이름으로 만 확장합니다.
% ~ xI % I을 파일 확장자로만 확장합니다.
% ~ sI 짧은 ​​이름 만 포함하도록 경로를 확장합니다.
% ~ aI % I을 파일의 파일 속성으로 확장합니다.
% ~ tI % I를 파일의 날짜와 시간으로 확장합니다.
% ~ zI % I을 파일 크기로 확장합니다.
% ~ $ PATH : I PATH 환경에 나열된 디렉토리를 검색합니다 
                        변수를 % I을 정규화 된 이름으로 확장합니다. 
                        첫 번째 발견. 환경 변수 이름이
                        정의되지 않았거나 검색에서 파일을 찾을 수 없습니다.
                        이 수정자는 빈 문자열로 확장됩니다.    

8
그냥 빨리 참고 : 위의 예에서 %% F는 같은 것입니다 C:\Users\Admin\Ordner\foo.flv%% ~ NF는 당신을 줄 것입니다 foo. 확장명을 제외한 모든 것을 원한다면 %% ~ df %% ~ pf %% ~ nf 를 사용하십시오C:\Users\Admin\Ordner\foo
ehambright

8
@ehambright 늦은 의견이지만, 사용하는 %%~dpnf것이 더 짧은 대안이라고 생각 합니다.

수정 자 / 설명 테이블 Dirk에 감사드립니다. 내 경우 %1에는 배치 스크립트의 param 에서 확장자가없는 파일 이름을 가져 왔습니다 . echo %~n1내가 쫓아 온 것이 었습니다.
Dave Pile

26

변수가 보유한 파일이 실제로 존재하지 않으면 FOR접근 방식이 작동하지 않습니다. 확장의 길이를 알고 있다면 사용할 수있는 트릭은 하위 문자열을 취하는 것입니다.

%var:~0,-4%

-4수단 (아마도 마지막 4 자리한다는 .ext를는 ) 절단한다.


이것은 나를 위해 작동하지 않습니다 (Win8.1에서)-아마도 echo %f:~0,-4%질문에 사용 된 예제의 맥락에서 시도 할 때 오해 할 수 있습니다. 내가 뭘 잘못하고 있죠?
Wolf

2
분명히 그것은 FOR 변수가 아닌 "정상적인"변수에 대해 작동합니다 (또는 아마도 올바른 구문을 모릅니다). 어쨌든 이것은 OP 예제 SET fl=%%f와 관련하여 작동합니다.echo %fl:~0,-4%
Ohad Schneider

@ 늑대 당신은 루프 변수의 값을 일반 변수로 설정 한 다음 일반 변수에서 문자열 대체 / 자르기를 수행해야합니다
phuclv

충분한 경우보다 연장 길이가 3이 아니거나 알 수 없습니다. 파일이 존재하지 않아도에 대해 계속 사용할 수 있습니다. 내 답변을 참조하십시오.
marsze

14

나는 또한 Windows cmd에 익숙하지 않지만 이것을 시도하십시오.

echo %%~nf

8

이것은 매우 늦은 응답이지만 DiskInternals LinuxReader에서 NTFS가 아닌 디렉토리 (FAT32) 디렉토리에 저장된 파일에 '.efs_ntfs'를 추가하는 특정 문제를 해결하기 위해이 문제를 해결했습니다.

@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause

질문에 대한 답변이 확실하지 않지만 실제로 도움이되었습니다. 감사합니다!
matan7890

1
@ matan7890 True; op는 "파일 (들)을 사용하여 일부 작업을 수행하고 싶습니다"[sic]에 포함 된 내용을 지정하지 않지만 이러한 작업 중 하나의 이름이 변경 될 수 있습니다.이 경우 내 답변은 허용되는 답변의 확장입니다.
Agi Hammerthief

이것은 첨부 파일을 열고 .encrypted몸값 요구와 함께 모든 파일에 추가 한 내 친구에게 도움이되었습니다 . 분명히 공격하는 스크립트는 이것과 반대 인 배치 파일이어야 .encrypted하고 모든 파일에 추가 된 것이어야 합니다.
AwokeKnowing

1
확장명이 없는 파일 이름 ( %%)아니라 원래 질문 의 %% f 출력과 가장 유사한 드라이브, 경로 및 확장 ( %% ~ df %% ~ pf %% ~ nf )을 언급했기 때문에 upvoted ~ nf )
ehambright

5

디렉토리에서 기존 파일을 반복하지 않고 변수에서 확장을 간단히 제거하려는 경우 이것을 사용하고 있습니다.

for %%f in ("%filename%") do set filename=%%~nf

전체 경로에서 확장을 제거하려면 %%dpnf대신 다음을 사용하십시오 .

for %%f in ("%path%") do set path=%%~dpnf

예:

(콘솔에서 직접 사용)

@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf

OUTPUT:

file name
C:\Dir\file

0

cygwin bash를 사용하여 자르기

  :: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
  set FILE=%1
  for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a

0

변수가 인수이면 간단히 %~dpn인수 번호 를 사용할 수 있으므로 다양한 확장 길이에 대해 걱정할 필요가 없습니다.

예를 들어 %~dpn0, 확장자가없는 배치 파일의 경로를 반환하고 확장자 %~dpn1%1없는 등 의 경로를 반환합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.