2017-12-22 3 views
1

여기 박쥐 파일을 제외하고 현재 폴더에있는 모든 파일을 삭제하는 방법입니다 : forfiles - 거짓 대 FALSE는 (소문자 작동하지 않습니다?)

forfiles /c "cmd /c if @isdir equ FALSE if /i not @ext==\"bat\" del @file" 

(나는 그것을 here 발견).

내가 발견 한대로 FALSE에서 false으로 변경하면 작동하지 않습니다. 왜? 내 주요 질문이야.

또한 측면 질문입니다. 첫 번째 코드는 다음과 같습니다.

forfiles /c "cmd /c if @isdir==FALSE if /i not @ext==\"bat\" del @file" 

? 첫 번째 질문에 대한

+0

표준 'FOR'명령이 정상적으로 작동하면'FORFILES'를 사용하는 이유는 무엇입니까? 'FOR' 명령은 파일만을 나열합니다. – Squashman

+0

@Squashman 나는 박쥐 스크립트에 익숙하지 않다. 제공된 솔루션은 내가 아래에 게시 한 링크에서 복사하여 붙여 넣었습니다. 같은 저자 ('dir/b/ad^| findstr/vile ".sdbk .log .bat"')의/f %% F에 대한 다른 해결책은 "%% F" 파일 이름에 공백이 있으면 작업하지 않습니다. –

+1

'forfiles' 명령과'if' 문과 관련된 모든 것은 없습니다. 'if /? '를 확인하십시오. – SomethingDark

답변

4

@isdir은 대문자로 항상 FALSE 또는 TRUE으로 확장됩니다.

if @isdir equ FALSE

FALSE 때문에 FALSE이나 문자열 TRUE 정수로 성공적으로 변환 할 수도 문자열의 문자열 비교로 다시 떨어지는 정수 비교 연산자 EQU를 사용하여와 FALSE 또는 TRUE의 대소 문자를 구분 문자열 비교입니다, 자세한 내용은 Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files를 참조하십시오. 명령 줄에서 대소 문자를 구분 문자열 비교 사용을 위해

:

if /I @isdir == FALSE 

그리고 if @isdir==FALSEif @isdir equ FALSE보다 더 나은이지만, 동작은 동일합니다.

if @isdir == FALSE은 100 % 올바른 구문이므로 사용하는 것이 가장 좋습니다. 평등 문자열 비교 명령 구문


경우 :

IF FirstStringToCompare == SecondStringToCompare Command 

또는 공간 또는 &()[]{}<>|^=;!'+,`~ 함유 문자열

IF "first string to compare" == "second string to compare" "command to execute" 

명령은 이고 먼저 인수 분리 IF 공백 문자가있는 문자열. 문자열은입니다. 이 경우또는 TRUE 문자열입니다. 비교할 첫 번째 문자열은 두 번째 인수와 공백으로 구분되며 동등 연산자는 ==입니다. 공간이 하나 더 있으면 비교할 두 번째 문자열 인 세 번째 인수가 지정됩니다. 세 번째 인수의 공백으로 다시 구분 된 마지막 명령은 문자열 동일성으로 실행할 명령입니다.

연산자 == 주위의 공백은 실제로는 첫 번째와 두 번째 및 세 번째 인수를 구분할 필요가 있지만 종종 생략됩니다.그러나 Windows 명령 인터프리터는 운영자 == 주위 누락 된 공간을 인식하고 출력 결과 명령 프롬프트 창에서이 배치 파일을 단지 두 줄

if FALSE==FALSE echo It is FALSE. 
if TRUE == FALSE echo It is FALSE. 

을 배치 파일로 작성에 자동으로 볼 수있는로 추가하고 실행 :

if FALSE == FALSE echo It is FALSE. 
It is FALSE. 
if TRUE == FALSE echo It is FALSE. 

정말 Windows 명령 인터프리터에 의해 전처리 한 후 실행 된 명령 줄 것은 각 인수 사이에 하나의 공간을 가지고있다.

명령 프롬프트 창 if /?에서 실행에 출력으로 문자열 비교 구문을 보여줍니다 경우 명령 에 대한 도움말 :

그래서 그것을 [NOT] 문자열 1 == 문자열 2 명령

IF 비교할 문자열이 등호를 포함하지 않는 한 ==의 왼쪽과 오른쪽 공백은 실제로 필요하지 않다고 가정 할 수 있습니다.이 경우에는 두 문자열을 큰 따옴표로 묶어야합니다.

+0

Solid . 내 .02 $, @ 존 c. j.,이 사이트는 귀하의 친구입니다 https://ss64.com/nt/forfiles.html (관련 명령 연결) – Tzalumen

+0

@ 모피 감사합니다. Stack Overflow에서이 질문을 게시하기 전에 간단히 [MS Technet에서 제공하는 예제] (https://technet.microsoft.com/ko-kr/library/cc753551(v= ws.11) .aspx)를 보았습니다. 'forfiles/p c : \/s/m *. */c "@ isdir == true 인 경우 cmd/c echo @file은 디렉토리입니다. 보시다시피, 소문자를 사용하며 대소 문자를 구분하지 않습니다. 따라서 Microsoft의 예가 잘못되었습니다. –

+0

@ john-c-j 예, Microsoft의 주어진 @ isdir에 대한 코드 예제가 잘못되었습니다. 실수를했을 수도 있는지 궁금해했습니다. Microsoft가 제공 한'@ isdir == true'는 항상 false로 평가되지만'@ isdir == TRUE'를 사용하면 예상대로 작동합니다. – Tzalumen

2

대답은 여기가 이 ... 상태 https://technet.microsoft.com/en-us/library/cc753551(v=ws.11).aspx 찾을 수 있습니다 "파일 형식이. 디렉토리입니다 그렇지 않으면,이 변수가 FALSE로 평가되면 @ISDIR TRUE로 평가합니다."

+0

제가 이해하는 한, 대문자를 사용해야합니다. 아이러니 컬하게도, 같은 페이지가 소문자로 제공된 (틀린?) 예 :'forfiles/pc : \/s/m *. */c "@ isdir == true 인 경우 cmd/c echo @file은 디렉토리" –