배치 파일에서 와일드 카드와 일치하는 파일을 반복하는 방법


194

기본 파일 이름 세트가 있으며 각 이름 'f'에 대해 정확히 두 개의 파일 'f.in'과 'f.out'이 있습니다. 모든 파일 이름을 통과하는 배치 파일 (Windows XP의 경우)을 작성하고 싶습니다.

  • 기본 이름 'f'를 표시하십시오.
  • 'f.in'에 대한 조치 수행
  • 'f.out'에서 다른 조치를 수행하십시오.

예를 들어 * .in (또는 * .out)을 검색하는 것 이외의 기본 파일 이름 세트를 나열 할 방법이 없습니다.


10
난 정말 111/0 투표 후이 사람이되고 싶지 않아,하지만 귀하의 질문은 어떤 재조사 whatsoeaver를 보여주지 않습니다
phil294

답변:


293

두 개의 파일 process_in.exe와 process_out.exe를 처리하는 두 개의 프로그램이 있다고 가정합니다.

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%% ~ nf는 % f를 파일 이름으로 만 확장하는 대체 수정 자입니다. https://technet.microsoft.com/en-us/library/bb490909.aspx (페이지 중간) 또는 다음 답변에서 다른 수정자를 참조하십시오 .


47
명령 행에 이것을 입력하는 경우 단일 '%'를 사용하십시오. OP가 명령 줄에 대해 묻지 않는다는 것을 알고 있지만,이 질문이 Google 검색의 맨 위에 나타 났을 때 내가 찾던 것입니다. 다른 사람들은이 비트에 감사 할 것입니다.
Jason

2
구문을 설명해 주시겠습니까? 루프 변수가 나중에 선언 된 %%f이유는 %%~nf무엇입니까?
대령 패닉

6
@ColonelPanic- ~예제와 같이 파일 이름을 얻는 몇 가지 수정자가 있습니다. *전체 경로 또는 무언가를 수행하는 경우에 사용하는 것이 습관입니다 . 이러한 수정 자 중 몇 가지가 있습니다 (페이지 중간) : microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Jim Buck

파일과 디렉토리에 공백이 있으면 어떻게합니까?
BKSpurgeon

3
또한 %% f 변수는 단일 문자 여야합니다. 읽기 쉽고 의미있는 것을 사용하려고하면 암호 오류 메시지가 나타납니다.
Bruce Dawson

90

이 줄을 사용하여 데스크탑의 내용을 인쇄 할 수 있습니다.

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

당신은 일단 %%I변수를 그것의 명령을 수행하기 위해 쉽게 (당신의 프로그램으로 단어 에코 대체)

또한 FOR 변수 참조의 대체가 향상되었습니다. 이제 다음 선택적 구문을 사용할 수 있습니다.

%~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 (directory with \)
%~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

https://ss64.com/nt/syntax-args.html

위의 예 %I에서 PATH는 다른 유효한 값으로 대체 될 수 있습니다. %~구문 유효한 FOR 변수 이름으로 종료된다. 대문자 변수 이름을 선택 %I하면 더 읽기 쉽고 대소 문자를 구분하지 않는 수정 자와 혼동되지 않습니다.

다음을 입력하여 전체 설명서를 얻을 수 있습니다 FOR /?


작동하지 않는 것 같습니다. %%I was unexpected at this time.
Brad

4
@Brad 명령 줄 (일괄 처리 파일이 아닌)에서 이것을 사용한다면, %I대신에%%I
doubleDown

1
허용되는 것보다 훨씬 더 나은 답변. 제 3 자 웹 사이트가 아닌 답변에 포함 된 모든 플래그 / 수정 자 ( 아무도 링크를 클릭 하고 싶지 않습니다 , Louis )
JustCarty

5

내가 보는 것처럼 가장 쉬운 방법은 처리를 위해 두 번째 배치 파일을 호출하는 for 루프를 사용하여 두 번째 파일을 기본 이름으로 전달하는 것입니다.

for /?에 따르면 도움말, basename은 nifty ~ n 옵션을 사용하여 추출 할 수 있습니다. 따라서 기본 스크립트는 다음과 같습니다.

for %%f in (*.in) do call process.cmd %%~nf

그런 다음 process.cmd에서 % 0에 기본 이름이 포함되어 있다고 가정합니다. 예를 들면 다음과 같습니다.

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

하나의 스크립트 에서이 작업을 수행하는 더 좋은 방법이있을 수 있지만 배치 파일의 단일 for 루프에서 여러 명령을 가져 오는 방법에 대해서는 항상 약간 흐릿했습니다.

편집 : 환상적입니다! FOR 루프에서 여러 줄 블록을 수행 할 수 있음을 보여주는 문서의 페이지를 어떻게 든 놓쳤습니다. 이제 돌아가서 배치 파일을 다시 작성해야합니다 ...


4

Nathans 포스트 에서 확장 . 다음은 하나의 배치 파일에서 작업 로트를 수행합니다.

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end

3

forfiles 라는 MS 서버에서 일반적으로 사용되는 도구가 있습니다 (기억할 수있는 한) .

위의 링크에는 도움말과 Microsoft 다운로드 페이지에 대한 링크가 포함되어 있습니다.


1

아래 코드는 주어진 부분 문자열로 시작하는 파일 이름을 필터링합니다. 하위 이름 하위 문자열 추출 및 IF 문을 작업하여 다른 요구에 맞게 변경할 수 있습니다.

echo off
rem filter all files not starting with the prefix 'dat'
setlocal enabledelayedexpansion
FOR /R your-folder-fullpath %%F IN (*.*) DO (
set fname=%%~nF
set subfname=!fname:~0,3!
IF NOT "!subfname!" == "dat" echo "%%F"
)
pause

0

f.in과 f.out을 반향하면 for / f 루프에서 사용될 때 루프 대상과 루프 대상이 아닌 개념이 분리됩니다.

::Get the files seperated
echo f.in>files_to_pass_through.txt
echo f.out>>files_to_pass_through.txt

for /F %%a in (files_to_pass_through.txt) do (
for /R %%b in (*.*) do (
if "%%a" NEQ "%%b" (
echo %%b>>dont_pass_through_these.txt
)
)
)
::I'm assuming the base name is the whole string "f".
::If I'm right then all the files begin with "f".
::So all you have to do is display "f". right?
::But that would be too easy.
::Let's do this the right way.
for /f %%C in (dont_pass_through_these.txt)
::displays the filename and not the extention
echo %~nC
)

묻지 않았지만 f.in 및 f.out으로 명령을 전달하는 좋은 방법은 ...

for /F %%D "tokens=*" in (dont_pass_through_these.txt) do (
for /F %%E in (%%D) do (
start /wait %%E
)
)

모든 Windows XP 명령에 대한 링크 : link

이 답변에 올바르게 답변하지 않으면 사과드립니다. 그 질문을 읽기가 매우 어려웠습니다.

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