2011-05-09 1 views
1

많은 파일을 두 개의 개별 파일로 연결하려고합니다.배치 - 역/음수 FOR 루프?

첫 번째 파일은 파일 이름에 "bob"이있는 다른 모든 파일의 연결입니다. 두 번째 파일은 파일 이름에 "bob"없이 모든 파일을 연결합니다. 두 파일은 실제로 연결을 수행하기 전에 파일의 이름을 출력합니다.

는 여기에 지금까지이 작업은 다음과 같습니다

  @echo off 
      setlocal EnableDelayedExpansion 
      set bob=All_bob.txt 
      set jimmy=All_jimmy.txt 

      if exist %bob% del %bob% 
      if exist %jimmy% del %jimmy% 

      for %%a in (*bob*.txt) do (
      echo /* >>%bob% 
      echo * %%a >>%bob% 
      echo */ >>%bob% 
      copy/b %bob%+"%%a" %bob% 
      echo. >>%bob% 
      echo. >>%bob%) 


      for %%a not in (*bob*.txt) do (
      echo /* >>%jimmy% 
      echo * %%a >>%jimmy% 
      echo */ >>%jimmy% 
      copy/b %jimmy%+"%%a" %jimmy% 
      echo. >>%jimmy% 
      echo. >>%jimmy%) 

그러나 (맨 아래) 루프에 대한 두 번째 사용 좋은 "하지"재생하려면,이 같은 느낌표를 사용하지 않습니다 ..

  for %%a !(*bob*.txt) do (

... 역시 작동하지 않습니다. 그렇다면 괄호 안에있는 내용을 포함하지 않는 파일을 어떻게 연결합니까?

답변

0

깨끗한 해결책이 없다고 생각합니다.

아마도 %% a를 필터링하기 위해 FINDSTR을 사용할 수는 있지만 *bob*.txt을 정규 표현식으로 바꾸어야 할 수 있으며 아마도 자동화하기가 쉽지 않습니다.

for /F %%a in ('dir /b *.txt') do (
echo %%a | find /V "bob") 

이것은에서 "밥"이없는 모든 .txt 인 파일을 반환해야합니다 :

echo bob: 
for %%a in (*bob*.txt) do (
    echo %%a 
) 

echo not bob: 
for %%a in (*) do (
    setlocal ENABLEDELAYEDEXPANSION&set inc=1 
    for %%b in (*bob*.txt) do if "%%~a"=="%%~b" set inc=0 
    if "!inc!"=="1" echo %%a 
    endlocal 
) 
0

방법을 찾기를 사용하는 방법에 대한 :

또 다른 (추한) 솔루션은 중첩 루프를 사용하는 것입니다 그들.

for /f "usebackq delims=" %%a in (`dir /b ^| findstr ".*bob.*\.txt"`) do (…) 

그냥 다른 모든 파일을 처리 할 /V 스위치를 사용 : findstr*bob*.txt에 대한 정규 표현식을 사용

+0

이 예제에서는 문제가 없지만 검색 문자열이 foo * bar * baz.txt 또는 b? b.txt 인 경우 – Anders

+0

@Anders는 OP 질문에 응답합니다. –

0

for /f "usebackq delims=" %%a in (`dir /b ^| findstr /v ".*bob.*\.txt"`) do (…) 

당신은 help 명령이나 for에 대한 /? 스위치를 사용할 수 있습니다 자세한 내용은 findstr을 참조하십시오.
구분 기호 (delims=)를 지워 파일 이름의 공백을 허용합니다.

+0

파일 검색'foo * bar * baz.txt' 또는'b? b.txt' :와 일치 시키려면'foo. * bar. * baz \ .txt' 또는'b.b \ .txt' 패턴을 사용하십시오. – mousio