for
루프를 사용하여 디렉토리의 각 파일을 어떻게 반복 할 수 있습니까?
특정 항목이 디렉토리인지 아니면 파일인지를 어떻게 알 수 있습니까?
for
루프를 사용하여 디렉토리의 각 파일을 어떻게 반복 할 수 있습니까?
특정 항목이 디렉토리인지 아니면 파일인지를 어떻게 알 수 있습니까?
답변:
현재 디렉토리에있는 모든 파일과 파일 만 나열됩니다.
for /r %i in (*) do echo %i
또한 배치 파일에서 해당 명령을 실행하는 경우 % 부호를 두 배로 늘려야합니다.
for /r %%i in (*) do echo %%i
(감사합니다 @agnul)
for /r %i in (*) do ( echo %~nxi )
. 이 스레드는 정말 너무 유용 할 수 있습니다 : stackoverflow.com/questions/112055/... .
반복 ...
for %f in (.\*) do @echo %f
for /D %s in (.\*) do @echo %s
for /R %f in (.\*) do @echo %f
for /R /D %s in (.\*) do @echo %s
불행히도 파일과 하위 디렉토리를 동시에 반복하는 방법을 찾지 못했습니다.
더 많은 기능을 위해 bash와 함께 cygwin 을 사용하십시오 .
이 외에도 MS Windows의 기본 제공 도움말은 cmd의 명령 줄 구문에 대한 설명을 제공하는 훌륭한 리소스입니다.
또한 여기를보십시오 : http://technet.microsoft.com/en-us/library/bb490890.aspx
%file
그리고 %subdir
단지 즉 긴 한 문자가 될 수 있습니다 %f
, %s
.
각 파일을 반복하려면 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-loop는 디렉토리의 모든 파일을 나열합니다.
pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd
"delims ="는 공백이있는 긴 파일 이름을 표시하는 데 유용합니다 ...
'/ b'는 크기 날짜 등이 아닌 이름 만 표시합니다.
dir의 / a 인수에 대해 알아야 할 사항.
명령 행에서 이것을 사용하는 경우 "%"를 제거하십시오.
도움이 되었기를 바랍니다.
for %1 in (*.*) do echo %1
전체 안내서를 보려면 cmd에서 "HELP FOR"을 사용해보십시오.
XP 명령어를위한 안내서입니다. http://www.ss64.com/nt/
사용할 수있는 모든 파일과 폴더 를 반복 하려면
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 /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
https://ss64.com/nt/for_r.html을 찾을 때까지 절대 경로로 작업하기 위해 jop의 대답을 얻는 데 문제가있었습니다.
다음 예제는 절대 경로로 지정된 디렉토리의 모든 파일을 반복합니다.
For /R C:\absoulte\path\ %%G IN (*.*) do (
Echo %%G
)
배치에서 이름이 파일 또는 디렉토리임을 알 수 없기 때문에 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에서 FileSystemObject를 확인하십시오 .
파일이 디렉토리인지 테스트하려면 다음을 시도하십시오.
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의 메시지 "파일을 찾을 수 없음"에 대해 테스트 할 수 있습니다. ".
이 시도:
::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
디렉터리 (및 하위 디렉터리)의 .msi 및 .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"
)
다음은 코드에서 주석으로 이동 한 것입니다.
나는 단지 biatch 기술로 솔질하고있어서 명백한 오류를 용서합니다.
사용자가 필요로하는 부분을 약간 수정하면 가능한 한 최선의 솔루션으로 모든 것을 작성하려고했습니다.
몇 가지 중요한 참고 사항 : 루트 디렉토리 파일 및 폴더 만 처리 하려면 변수 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