2010-07-09 9 views
112
나는 위키 백과에서 다음 배치 스크립트 한

: 확장 FLV로에 대한 루프의 모든 파일에배치 : 제거 파일 확장자

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

는 에코 얻을, 하지만 난 화장을 원하는 파일을 일부 작업 (s) 확장자가없는 파일은 한 번만, 확장명은 한 번만 필요합니다. 어떻게이 두 가지를 얻을 수 있습니까?

솔루션을 찾았지만 찾지 못했습니다. 나는 또한 cmd를 창에 낯선 사람이야

답변

221

당신은의 설명에 따라 파일 이름을 얻을 수 %%~nf을 사용할 수 있습니다 for에 대한 참조 :

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

다음 옵션을 사용할 수 있습니다

 
Variable with modifier Description 

%~I      Expands %I which removes any surrounding 
         quotation marks (""). 
%~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     Expands path to contain short names only. 
%~aI     Expands %I to the file attributes of file. 
%~tI     Expands %I to the date and time of file. 
%~zI     Expands %I to the 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, 
         this modifier expands to the empty string.  
+0

위대한 직업. 그것은 나를 도왔다. –

+2

위의 예제에서 ** %% f **는'C : \ Users \ Admin \ Ordner \ foo.flv'와 같을 것이고 ** %% ~ nf **는'foo'를 줄 것입니다. . 당신이 모든 것을 원한다면 확장자는 ** %% ~ df %% ~ pf %% ~ nf **를 사용하면'C : \ Users \ Admin \ Ordner \ foo'를 얻을 수 있습니다. – ehambright

13

... 일괄 진짜 초보자 해요,하지만이 시도 :

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 
+0

질문,하지만 실제로 도움이, 감사합니다! – matan7890

+1

@ matan7890 참; op는 "내가 파일에서 어떤 행동을 취하길 원한다"는 것을 지정하지 않지만 그러한 행동 중 하나가 이름을 바꿀 수 있습니다.이 경우 내 대답은 수용된 대답의 확장입니다. –

+0

이것은 첨부 파일을 열고 자신의 모든 파일에'.encrypted '를 추가 한 친구를 몸값 요구와 함께 도왔습니다. 분명히 공격 스크립트는 이것과 반대되는 배치 파일이어야하고 모든 파일에'.encrypted '를 추가해야합니다. – AwokeKnowing

23

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

%var:~0,-4% 

-4는 마지막 4 자리 숫자 ( .ext를 아마도 )가 잘립니다 것을 의미한다.

+0

이것은 나를 위해 (Win8.1에서) 작동하지 않습니다 - 어쩌면 나는'echo % f : ~ 0, -4 %를 시도 할 때 그것을 오해 할 수 있습니다. '라는 질문에 사용 된 예제의 맥락에서. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – Wolf

+2

분명히 그것은 "정상적인"변수가 아니라 FOR 변수 (또는 어쩌면 나는 단지 올바른 구문을 모른다)에서 작동합니다.어쨌든 이것은 OP 예제의 문맥에서 작동합니다 :'SET fl = %% f' 그리고 나서'echo % fl : ~ 0, -4 %' –

+1

Win10에서 % 1, % 2 등 고맙습니다! – deko

0

하나 이상의 확장을 제거하는 방법은 무엇입니까? 내 파일의 확장명은 filename.abc.def.xyz.anything이고 파일 이름 만 추출합니다.