문제

기본 파일 이름 세트가 있습니다. 각 이름 'f'에는 정확히 'f.in'과 'f.out'이라는 두 개의 파일이 있습니다.Windows XP에서 각 파일 이름에 대해 모든 파일 이름을 처리하는 배치 파일을 작성하고 싶습니다.

  • 기본 이름 'f'를 표시합니다.
  • 'f.in'에 대한 작업 수행
  • 'f.out'에서 다른 작업 수행

예를 들어 *.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 (페이지 중간) 또는 다음 답변에 있습니다.

다른 팁

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

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

일단 당신은 %%I 변수에 대해 명령을 수행하기 쉽습니다(단지 echo라는 단어를 프로그램으로 바꾸십시오).

또한 가변 참조를 대체하여 향상되었습니다. 이제 다음 옵션 구문을 사용할 수 있습니다.

%~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][1]

위의 예에서는 %I 경로는 다른 유효한 값으로 대체 될 수 있습니다.그만큼 %~ 구문은 유효한 FOR 변수 이름으로 종료됩니다.다음과 같은 대문자 변수 이름 선택 %I 더 읽기 쉽게 만들고 사례에 민감하지 않은 수정 자와의 혼란을 피하십시오.

다음을 입력하면 전체 문서를 얻을 수 있습니다. FOR /?

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

for /?에 따르면help, basename은 멋진 ~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 루프에서 여러 줄 블록을 수행할 수 있음을 보여주는 문서의 페이지를 어떻게든 놓쳤습니다.이제 돌아가서 일부 배치 파일을 다시 작성해야 합니다...

내가 기억하는 한 MS 서버에서 일반적으로 사용되는 도구가 있습니다. forfiles:

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

확장 중 네이선스 우편.다음은 하나의 배치 파일에서 많은 작업을 수행합니다.

@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

아래 코드는 주어진 하위 문자열로 시작하는 파일 이름을 필터링합니다.subfname 하위 문자열 추출 및 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 명령에 대한 링크:링크

제가 이 부분에 대해 제대로 대답하지 못했다면 사과드립니다.그 질문은 제가 읽기에 매우 어려웠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top