[file] 배치 : 파일 확장자 제거

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

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

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

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



답변

%%~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을 정규화 된 이름으로 확장합니다.
                        첫 번째 발견. 환경 변수 이름이
                        정의되지 않았거나 검색에서 파일을 찾을 수 없습니다.
                        이 수정자는 빈 문자열로 확장됩니다.


답변

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

%var:~0,-4%

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


답변

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

echo %%~nf


답변

이것은 매우 늦은 응답이지만 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


답변

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

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


답변

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


답변

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

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