programing

'for' 루프를 사용하여 디렉토리 내의 모든 파일을 반복합니다.

skycolor 2023. 4. 22. 09:11
반응형

'for' 루프를 사용하여 디렉토리 내의 모든 파일을 반복합니다.

각, 「」를 하려면 , 요?for 루우프? 루우프?

그리고 특정 엔트리가 디렉토리인지 파일인지 어떻게 알 수 있을까요?

현재 디렉토리와 하위 디렉토리의 모든 파일(및 파일만)이 재귀적으로 나열됩니다.

for /r %i in (*) do echo %i

또한 이 명령을 배치 파일로 실행할 경우 % 기호를 두 배로 해야 합니다.

for /r %%i in (*) do echo %%i

(고마워 @agnul)

반복...

  • dir의 : ..."dir" :for %f in (.\*) do @echo %f
  • 의 ..."dir" "dir" :for /D %s in (.\*) do @echo %s
  • 및 : ...「 」 「 」 、 「 」for /R %f in (.\*) do @echo %f
  • 및 의 서브디어: ...현재 및 모든 서브디어의 서브디어:for /R /D %s in (.\*) do @echo %s

유감스럽게도 파일과 서브디어를 동시에 반복할 수 있는 방법을 찾을 수 없었습니다.

bash와 함께 sygwin을 사용하면 훨씬 더 많은 기능을 얻을 수 있습니다.

이것과는 별도로:MS Windows의 빌트인 도움말은 cmd의 명령줄 구문을 설명하는 데 유용한 리소스입니다.

여기도 봐주세요.http://technet.microsoft.com/en-us/library/bb490890.aspx

각 파일에 걸쳐 반복하려면 for 루프가 작동합니다.

for %%f in (directory\path\*) do ( something_here )

저 같은 경우에는 파일 내용, 이름 등을 원합니다.

이로 인해 몇 가지 문제가 발생했고, 저는 제 활용 사례가 도움이 될 것이라고 생각했습니다.디렉토리내의 각 「.txt」파일로부터 정보를 읽어내, 그 파일(예를 들면 setx)을 조작할 수 있는 루프가 있습니다.

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

*제한: val <=%f는 파일의 첫 줄만 가져옵니다.

가 있다.FOR명령줄 및 배치 파일에서 가져옵니다.에는 두 개의 어미 파일을 .%각 변수 참조 앞에 있는 문자

명령줄에서:

FOR %i IN (*) DO ECHO %i

배치 파일에서:

FOR %%i IN (*) DO ECHO %%i

이 for-loop은 디렉토리 내의 모든 파일을 나열합니다.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"filename="은 공백이 있는 긴 파일 이름을 표시하는 데 유용합니다.

'/b"는 이름만 표시하며 크기 날짜 등은 표시하지 않습니다.

dir's /a 인수에 대해 알아야 할 몇 가지 사항.

  • "/a"를 사용하면 숨김 및 시스템 속성을 포함한 모든 항목이 나열됩니다.
  • "/ad"는 숨겨진 디렉토리 및 시스템 디렉토리를 포함한 하위 디렉토리만 표시합니다.
  • "/a-d" 인수는 'D'irectory Atribute'의 내용을 삭제합니다.
  • "/a-d-h-s"는 모든 것을 표시하지만 "D'irectory", "H"idden "S"system 속성을 가진 항목입니다.

명령줄에서 이를 사용하는 경우 "%"를 삭제하십시오.

이게 도움이 됐으면 좋겠다.

%1은 전달된 첫 번째 인수를 참조하므로 반복기에서 사용할 수 없습니다.

이것을 시험해 보세요.

@echo off
for %%i in (*.*) do echo %%i

이 레퍼런스를 찾을 때까지 절대 경로로 작업하기 위한 jop의 답변을 얻는 데 어려움이 있었습니다.https://ss64.com/nt/for_r.html

다음 예제에서는 절대 경로에 의해 지정된 디렉토리 내의 모든 파일을 루프합니다.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)

코드에 코멘트를 넣은 제 시도입니다.

나는 단지 비지니스 기술을 연마하고 있을 뿐이니 명백한 실수는 용서해라.

사용자가 원하는 곳에 약간의 수정을 가하여 가능한 한 모든 것을 하나의 솔루션으로 작성하려고 했습니다.

몇 가지 중요한 주의:변수를 변경하기만 하면 됩니다.recursive로로 합니다.FALSE루트 디렉터리 파일 및 폴더만 처리하려는 경우.그렇지 않으면 모든 폴더와 파일을 검색합니다.

C&C 환영...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F 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
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls

사용할 수 있는 모든 파일폴더를 반복하려면

for /F "delims=" %%a in ('dir /b /s') do echo %%a

파일을 사용하지 않고 모든 폴더를 반복하려면

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

서 ★★★★★/s디렉토리 트리 전체의 모든 결과가 무제한으로 표시됩니다. 수 요./s

반복 검색 구현

특정 명명된 파일폴더를 반복하려면 이름을 검색하고 for loop을 사용하여 반복할 수 있습니다.

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

파일이 아닌 특정 이름 있는 폴더/디렉토리를 반복하여 사용하려면/AD

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
for %1 in (*.*) do echo %1

전체 가이드를 보려면 cmd의 "HELP FOR"를 사용해 보십시오.

이것은 XP 명령어 가이드입니다.http://www.ss64.com/nt/

다음 코드는 "AllFilesInCurrentDirectorylist"라는 이름의 파일을 만듭니다.txt"는 현재 디렉토리에 있는 모든 파일(파일만)의 목록을 포함합니다.이것을 확인해 보세요

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

forfiles 명령어를 사용할 수도 있습니다.

forfiles /s 

디렉토리인지 아닌지도 확인합니다.

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

vbscript(Windows Scripting Host)를 사용하고 싶습니다.배치에서는 이름이 파일인지 디렉토리인지 알 수 없기 때문입니다.

vbs에서는 다음과 같은 경우가 있습니다.

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

MSDN에서 File System Object를 확인합니다.

/L 옵션과 함께 xcopy 명령을 사용하여 파일 이름을 가져옵니다.디렉토리 또는 서브디렉토리의 모든 파일을 취득하려면 , 다음과 같이 할 수 있습니다.

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

c:\ 는 Windows 시스템에 항상 존재하고 복사되지 않기 때문에 수신처로 사용할 뿐입니다.서브디렉토리를 사용하는 경우는, 마지막에 /s 옵션을 사용해 주세요.다른 이유로 필요한 경우 xcopy의 다른 스위치를 사용할 수도 있습니다.

파일이 디렉토리인지 테스트하려면 다음 절차를 수행합니다.

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

이것은 파일이 디렉토리가 아닌지만 알려 줍니다.이것은 파일이 존재하지 않는 경우에도 해당되므로, 필요한 경우 먼저 해당 파일을 확인하십시오.주의사항(^)은 리다이렉트 기호를 이스케이프하기 위해 사용되며 파일목록 출력은 NUL로 리다이렉트되며 DIR 목록의 오류 출력은 출력으로 리다이렉트되므로 DIR 메시지 "File Not Found"에 대해 테스트할 수 있습니다.

이것을 시험해 보세요.

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

디렉토리(및 서브 디렉토리)에 있는 .disc 및 .exe 파일을 카운트합니다.따라서 폴더와 파일의 실행 파일도 달라집니다.

루프내의 다른 파일을 필터링 할 필요가 있는 경우는, 확장자(.pptx.docx ..)를 추가합니다.

내 경우 임시 폴더 아래에 있는 모든 파일과 폴더를 삭제해야 했습니다.그래서 이렇게 하게 됐어요.파일용 루프와 폴더용 루프 두 개를 실행해야 했습니다.파일 또는 폴더의 이름에 공백이 있으면 " " 를 사용해야 합니다.

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)

언급URL : https://stackoverflow.com/questions/138497/iterate-all-files-in-a-directory-using-a-for-loop

반응형