迭代的所有文件目录中的使用'的'循环
-
02-07-2019 - |
题
我怎么可以迭代,每个文件目录中的使用 for
循环?
我怎么能告诉我们,如果某一项是一个目录,或者如果它只是一个文件?
解决方案
列出当前目录中的所有文件(以及仅文件):
for /r %i in (*) do echo %i
此外,如果您在批处理文件中运行该命令,则需要将%符号加倍。
for /r %%i in (*) do echo %%i
(谢谢@agnul)
其他提示
迭代过...
- ...的文件在目前的dir:
for %f in (.\*) do @echo %f
- ...subdirs在当前dir:
for /D %s in (.\*) do @echo %s
- ...的文件在当前和所有subdirs:
for /R %f in (.\*) do @echo %f
- ...subdirs在当前和所有subdirs:
for /R /D %s in (.\*) do @echo %s
不幸的是我没有找到任何方式迭代的文件和subdirs在同一时间。
只是使用 cygwin 与其bash更多的功能。
除了这个:你有没有注意到,夜总会帮助MS Windows是一个伟大的资源的说明,记录的命令行法?
还有看看这里: http://technet.microsoft.com/en-us/library/bb490890.aspx
从命令行运行FOR
与批处理文件之间存在细微差别。在批处理文件中,您需要在每个变量引用前放置两个%
字符。
从命令行:
FOR %i IN (*) DO ECHO %i
从批处理文件:
FOR %%i IN (*) DO ECHO %%i
要迭代每个文件,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 <!> lt; = %% f只会获取文件的第一行。
这对于环将列表中的所有文件的目录。
pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd
"delims="是有用的,以表明长长的文件与空间。
'/b"显示只有名称,不大小的日期等。
有些事情要知道dir的一个论点。
- 任何使用"/a"将列出一切,包括隐藏和系统的属性。
- "/ad"只会表演子目录,包括隐藏和系统的。
- "/a-d"的说法消除的内容与'D'irectory属性。
- "/a-d-h-s"将显示一切,但条目与'D'irectory,'H'idden'S'ystem属性。
如果你用这个命令行,删除"%".
希望这会有所帮助。
%1指的是传入的第一个参数,不能在迭代器中使用。
试试这个:
@echo off
for %%i in (*.*) do echo %%i
以下代码在当前目录中创建名为 <!>“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
我使用xcopy命令/L选择,以获得该文件的名称。所以如果你想要得到的任何一个目录或所有文件的目录你可以做像这样的东西:
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的消息<!> ;找不到文件<!>“;
试试这个:
::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 ..)
在我的情况下,我必须删除临时文件夹下的所有文件和文件夹。所以这就是我最终做到的方式。我必须运行两个循环,一个用于文件,一个用于文件夹。如果文件或文件夹的名称中有空格,则必须使用<!> quot; QUOT <!>;
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"
)
要遍历所有文件和文件夹,您可以使用
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
将无限深度地在整个目录树中提供所有结果。如果要遍历该文件夹的内容而不是其子文件夹
/AD
在迭代中实施搜索
要遍历特定的命名文件和文件夹,您可以搜索名称并使用for循环进行迭代
for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a
要遍历特定的命名文件夹/目录而不是文件,请在同一命令中使用<=>
for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
在找到这个参考资料之前,我无法让jop的答案与绝对路径一起工作: https:/ /ss64.com/nt/for_r.html
以下示例循环遍历绝对路径指定的目录中的所有文件。
For /R C:\absoulte\path\ %%G IN (*.*) do (
Echo %%G
)