FOR 명령은 숨김 파일을 볼 수 없습니다.


4

나는 지금까지 만나지 못한 가장 좌절감을 자아내는 버그 중 하나와 고민 중입니다.

버그 설명 :

그만큼 for 명령 해석기의 명령은 숨겨진 파일을 볼 수 없습니다.

번식 단계 :

  1. 임시 디렉토리 만들기
  2. 몇 개의 파일 만들기
  3. 파일에 다양한 속성 지정 (숨김 포함)
  4. 다음 명령을 사용하십시오. for %i in (*) do echo "%i"

예상 결과 :

모든 파일은 for 루프는 기본적으로 또는 스위치를 통해 수행됩니다.

실제 결과:

  • 숨겨진 속성이 아닌 파일은 모두 처리됩니다. 숨김으로 플래그 된 파일은 건너 뜁니다.
  • 스위치가 없습니다. for 명령을 사용하여 숨겨진 파일을 처리 할 수 ​​있습니다.

암시 :

처리 할 방법이 없습니다. 모든 파일을 명령 프롬프트에서 가져옵니다.

의문:

어떻게 도대체 숨겨진 파일을 명령 프롬프트 나 배치 파일에서 처리 할 수 ​​있습니까? (DOS가 아닌 Windows에서는 최소한)?

답변:


4

다음은 파일에 대한 하나의 (못생긴, 불쾌한, 이상적이지 않은) 해결 방법입니다.

for /f "tokens=* delims=" %i in ('dir /b/a-d *') do echo "%i"

폴더 용 버전 ( for /d… ) :

for /f "tokens=* delims=" %i in ('dir /b/ad  *') do echo "%i"

그리고 두 버전 모두 (no for 아날로그이므로 이점이 있습니다).

for /f "tokens=* delims=" %i in ('dir /b/a   *') do echo "%i"


파일의 재귀 버전 ( for… /r ) :

for /f "tokens=* delims=" %i in ('dir /b/s/a-d *') do echo "%i"

폴더 ( for /r /d… ) :

for /f "tokens=* delims=" %i in ('dir /b/s/ad  *') do echo "%i"

그리고 둘 다

for /f "tokens=* delims=" %i in ('dir /b/s/a   *') do echo "%i"



이 방법은 다소 효과가 있지만 문제가 있습니다 (특히 파일이나 폴더가 큰 경우). 다행히도 더 나은 해결책이 있거나 Microsoft가 패치에서이를 개선 / 개선 할 수 있기를 바랍니다.


2
tokens=* 당신은 delims= 옵션 및 * 중복됩니다. 또한 dir /b/a 디렉토리와 파일을 나열합니다. 파일 만 필요하면 dir /b/a:-d. 그리고 Windows 명령 줄의 이러한 동작은 20 년 동안 변경되지 않았으므로 지금은 변경되지 않을 것입니다. 그것을 좋아하지 않아? 대신 VBScript 또는 PowerShell을 사용하십시오.
Ansgar Wiechers

@AnsgarWiechers, 팁 주셔서 감사합니다. 나는 보통 사용하지 않는다. /f 텍스트 파일 (예 : for /f "delims=" %i in (list.txt)… ), 그래서 나는 여분의 옵션을 잘 모른다. 네 말이 맞아. /a 디렉토리 나열; 나는 왜 나의 이전 시험이 그들을 나열하지 않았는지 모르겠다.
Synetech

@Synetech, 음, 나는 대답을 향상 시켰고 up-vote가 취소되었다. 나는 지금부터 더 나은 것들을 만드는 것을 배울 것입니다. 한숨
Synetech

나는 새로운 배치 파일을 위해 이것에 의지해야만했다. 솔직히 말해서 그렇게 나쁘지 않았다. 잘 돌아 간다. 충분히 기억하고 사용하는 것이 간단했습니다 (나는 tokensdelims 이것에 대한 옵션 모두). 나는 이것을 받아 들일 것이다. for 문법, 그래서 아무것도 다시 작성해야하고, "그냥"작동합니다.
Synetech

나는 /f 지난 수개월 동안 루프 표현에 대한 명령을 사용하도록 전환하고 솔직히 말해서 나는 그것에 익숙해 져있다. 명령을 시작하기 전에 먼저 목록을 작성하기 위해 먼저 모든 파일 / 폴더를 열거해야한다는 단점이 있지만, 다음과 같은 몇 가지 이점이 있습니다. ~을 사용하여 dir 숨겨진 / 시스템 파일 / 폴더에 액세스하고 처리하기 전에 목록을 작성하면 수정 된 항목을 다시 처리 할 필요가 없습니다. 정규의 for 루프는 in-situ에서 열거되므로 수정 된 객체가 다음과 같이 나타날 수 있으므로 무한 루프를 입력 할 수 있습니다. 새로운 (재 처리)해야합니다.
Synetech

3

너는 사용할 수있어. forfiles 대신에 for.

구문은 상당히 다르지만 더 많은 기능 (예 : 파일 이름, 확장명, 파일 크기 및 타임 스탬프에 기본적으로 액세스하는 방법)이 있으며 처리합니다 모든 기본적으로 파일입니다.

예를 들어, 대신

for %i in (*) do echo "%i"

너는 쓸거야.

forfiles /c "cmd /c echo @file"

또는 단순히

forfiles

이후 "cmd /c echo @file" 명령 스위치의 기본값입니다.


나쁘지 않다. 그것은 다른 구문을 사용하고 XP에서는 사용할 수 없지만 옵션이있는 것이 좋습니다. (필자는 실제로 유닉스 포트를 고려했지만, ls.exe 유용하다. for 명령은 Windows에있는 것처럼 셸에 내장되어 있습니다. Unix 쉘 포트를 사용할 수 있다고 가정하지만, Windows 명령 프롬프트는 아닙니다.)
Synetech

파이프의 출력을 파이프로 보낼 수 있습니다. lsxargs 또는 단순히 사용 find. 둘 다 Windows에서 사용할 수 있습니다.
Dennis

음, 재미있는 제안. 문제는 그와 같은 외부 명령을 실행하면 성능에 심각한 영향을 미칠 수 있다는 것입니다. 특히 파일 / 폴더가 많은 경우 (적어도 내장형 for 명령).
Synetech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.