기본 파일 이름 세트가 있으며 각 이름 'f'에 대해 정확히 두 개의 파일 'f.in'과 'f.out'이 있습니다. 모든 파일 이름을 통과하는 배치 파일 (Windows XP의 경우)을 작성하고 싶습니다.
- 기본 이름 'f'를 표시하십시오.
- 'f.in'에 대한 조치 수행
- 'f.out'에서 다른 조치를 수행하십시오.
예를 들어 * .in (또는 * .out)을 검색하는 것 이외의 기본 파일 이름 세트를 나열 할 방법이 없습니다.
기본 파일 이름 세트가 있으며 각 이름 'f'에 대해 정확히 두 개의 파일 'f.in'과 'f.out'이 있습니다. 모든 파일 이름을 통과하는 배치 파일 (Windows XP의 경우)을 작성하고 싶습니다.
예를 들어 * .in (또는 * .out)을 검색하는 것 이외의 기본 파일 이름 세트를 나열 할 방법이 없습니다.
답변:
두 개의 파일 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 (페이지 중간) 또는 다음 답변에서 다른 수정자를 참조하십시오 .
%%f
이유는 %%~nf
무엇입니까?
~
예제와 같이 파일 이름을 얻는 몇 가지 수정자가 있습니다. *
전체 경로 또는 무언가를 수행하는 경우에 사용하는 것이 습관입니다 . 이러한 수정 자 중 몇 가지가 있습니다 (페이지 중간) : microsoft.com/resources/documentation/windows/xp/all/proddocs/…
이 줄을 사용하여 데스크탑의 내용을 인쇄 할 수 있습니다.
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.
%I
대신에%%I
내가 보는 것처럼 가장 쉬운 방법은 처리를 위해 두 번째 배치 파일을 호출하는 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 루프에서 여러 줄 블록을 수행 할 수 있음을 보여주는 문서의 페이지를 어떻게 든 놓쳤습니다. 이제 돌아가서 배치 파일을 다시 작성해야합니다 ...
forfiles 라는 MS 서버에서 일반적으로 사용되는 도구가 있습니다 (기억할 수있는 한) .
위의 링크에는 도움말과 Microsoft 다운로드 페이지에 대한 링크가 포함되어 있습니다.
아래 코드는 주어진 부분 문자열로 시작하는 파일 이름을 필터링합니다. 하위 이름 하위 문자열 추출 및 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
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
이 답변에 올바르게 답변하지 않으면 사과드립니다. 그 질문을 읽기가 매우 어려웠습니다.