@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只会获取文件的第一行 .
10
在bash中,你可能会这样做:
for fn in *; do
if [ -d $fn ]; then
echo "$fn is a directory"
fi
if [ -f $fn ]; then
echo "$fn is a file"
fi
done
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
forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
11
试试这个:
::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
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"
)
15 回答
这将列出当前目录中的所有文件(以及仅文件):
此外,如果您在批处理文件中运行该命令,则需要将%符号加倍 .
(谢谢@agnul)
迭代...
...当前目录中的文件:
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
不幸的是,我没有找到任何方法同时迭代文件和子目录 .
只需使用cygwin及其bash即可获得更多功能 .
除此之外:您是否注意到,MS Windows的构建帮助是描述cmd命令行语法的重要资源?
另外看看这里:http://technet.microsoft.com/en-us/library/bb490890.aspx
从命令行运行
FOR
与批处理文件之间存在细微差别 . 在批处理文件中,您需要在每个变量引用前放置两个%
字符 .从命令行:
从批处理文件:
此for循环将列出目录中的所有文件 .
“delims =”对于显示带有空格的长文件名非常有用....
'/ b“只显示名称,而不是大小日期等 .
关于dir / a argument的一些事情 .
"/a"的任何使用都会列出所有内容,包括隐藏和系统属性 .
"/ad"只会显示子目录,包括隐藏目录和系统目录 .
"/a-d"参数使用'D' irectory属性消除内容 .
"/a-d-h-s"将显示所有内容,但条目为'D' irectory,'H' idden 'S' ystem属性 .
如果在命令行上使用此选项,请删除“%” .
希望这可以帮助 .
To iterate over each file a for loop will work:
for %%f in (directory\path\*) do ( something_here )
In my case I also wanted the file content, name, etc.
这导致一些问题,我认为我的用例可能会有所帮助 . 这是一个循环,它从目录中的每个'.txt'文件中读取信息,并允许您对它执行某些操作(例如setx) .
*限制:val <= %% f只会获取文件的第一行 .
在bash中,你可能会这样做:
我刚刚注意到你问过批次,我把它误读为bash . 因此,这个答案可能不适合您的问题 .
%1引用传入的第一个参数,不能在迭代器中使用 .
试试这个:
在cmd中尝试“帮助”获取完整指南
这是XP命令的指南 . http://www.ss64.com/nt/
以下代码在当前目录中创建名为 "AllFilesInCurrentDirectorylist.txt" 的文件,其中包含当前目录中所有文件(仅文件)的列表 . 看看这个
我会使用vbscript(Windows Scripting Host),因为在批处理中我确定你不能告诉你名字是文件或目录 .
在vbs中,它可以是这样的:
检查FileSystemObject on MSDN .
我使用带有/ L选项的xcopy命令来获取文件名 . 因此,如果您想要获取目录或子目录中的所有文件,您可以执行以下操作:
我只是使用c:\作为目标,因为它始终存在于Windows系统上并且它不是复制所以它无关紧要 . 如果你想要子目录也只是在末尾使用/ s选项 . 如果由于其他原因需要,您也可以使用xcopy的其他开关 .
试试这个来测试一个文件是否是一个目录:
这只会告诉你文件是不是一个目录,如果文件不存在也是如此,所以如果需要,请务必先检查一下 . 插入符号(^)用于转义重定向符号,文件列表输出重定向到NUL以防止它被显示,而DIR列表的错误输出被重定向到输出,因此您可以测试DIR的消息“找不到文件” ” .
它也可以使用forfiles命令:
并检查它是否是一个目录
试试这个:
它会计算目录(以及子目录)中的.msi和.exe文件 . 因此,它还将文件夹和文件之间的区别作为可执行文件 .
如果您需要过滤循环中的其他文件,只需添加扩展名(.pptx .docx ..)
在我的情况下,我不得不删除所有文件和文件夹在临时文件夹下 . 所以这就是我最终做到的方式 . 我必须运行两个循环,一个用于文件,一个用于文件夹 . 如果文件或文件夹的名称中有空格,则必须使用“”