Fortran进行批处理的方法
批处理for命令详解!

批处理for命令详解!⼤纲⼀前⾔⼆ for语句的基本⽤法三 for /f (delims、tokens、skip、eol、userbackq、变量延迟)四 for /r (递归遍历)五 for /d (遍历⽬录)六 for /l (计数循环)⼀、前⾔在批处理中,for是最为强⼤的命令语句,它的出现,使得解析⽂本内容、遍历⽂件路径、数值递增/递减等操作成为可能;配合if、call、 goto等流程控制语句,更是可以实现脚本复杂的⾃动化、智能化操作;合理使⽤for语句,还能使代码⼤为简化,免除各位编写⼤量重复语句之苦。
⽽能否熟练使⽤for语句,已经成为衡量⼀个⼈批处理⽔平⾼低最主要的标准。
在这个系列教程中,我将通过实际应⽤中频繁出现的例⼦,带领⼤家步⼊for语句的神奇之门,⼀步步迈向for语句的魔幻殿堂,使得⼤家在实际的应⽤中,能独⽴写出简洁⾼效的代码,在批处理的世界⾥⾃由驰骋。
注意:以下的讲解,都是基于简体中⽂版Windows XP Pro SP3的操作系统环境。
⼆、for语句的基本⽤法正如⾊彩缤纷的七彩光芒是由红绿蓝三原⾊构成的⼀样,最复杂的for语句,也有其基本形态,它的模样是这样的:在cmd窗⼝中:FOR %variable IN (set) DO command [command-parameters]在批处理⽂件中:FOR %%variable IN (set) DO command [command-parameters]具体例⼦:For %i in (1 2 3) do @echo %i之所以要区分cmd窗⼝和批处理⽂件两种环境,是因为在这两种环境下,命令语句表现出来的⾏为虽然基本⼀样,但是在细节上还是稍有不同。
最明显的⼀个差异就是:在cmd窗⼝中,for之后的形式变量I必须使⽤单百分号引⽤,即%i;⽽在批处理⽂件中,引⽤形式变量i必须使⽤双百分号,即%%i。
我们先来看⼀下for语句的基本要素都有些什么:1、for、in和do是for语句的关键字,它们三个缺⼀不可;2、%%I是for语句中对形式变量的引⽤,就算它在do后的语句中没有参与语句的执⾏,也是必须出现的;3、in之后,do之前的括号不能省略;4、command1表⽰字符串或变量,command2表⽰字符串、变量或命令语句;现在,你可能已经会写⼀个简单的for语句了,⽐如:[code1]@echo offfor %%I in () do echo %%Ipause保存为批处理⽂件并执⾏,将会在弹出的批处理窗⼝中看到这样的信息:请按任意键继续...很快地,你会觉得这个for语句是如此的简单,简单到你丝毫感受不出它的强⼤:这个for语句,和我直接⽤echo语句没什么两样啊!是的,演⽰代码永远都只是演⽰⽽已,就像⼤多数⾼级语⾔的教科书⼀样,在引导新⼿学习的时候,基本上都是千篇⼀律地告诉⼤家如何编写⼀个能显⽰ hello world! 的窗⼝,从这些演⽰代码中,你看不到它们具有多少实⽤性,你只是感到有点好奇:咦,居然弹出了⼀个窗⼝?⽚刻之后,你就会觉得索然⽆味。
fortran 77 按位操作函数

Fortran 77是一种广泛使用的高级编程语言,它对于科学计算和工程应用有着重要的作用。
在Fortran 77中,按位操作函数是一种非常有用的功能,可以用来处理二进制数据并且对位进行操作。
本文将介绍Fortran 77中的按位操作函数,包括其语法、用法和示例,并对其在实际编程中的应用进行讨论。
一、按位操作的基本概念在计算机中,数据是以二进制形式存储和处理的。
按位操作就是对这些二进制数据的每一位进行操作,包括与、或、非、异或等操作。
按位操作函数可以用来进行这些操作,从而实现对二进制数据的精确控制和处理。
二、Fortran 77中的按位操作函数在Fortran 77中,有一些内置的按位操作函数可以直接使用,包括:1. IAND:按位与操作,用来对两个数进行按位与运算。
2. IOR:按位或操作,用来对两个数进行按位或运算。
3. NOT:按位非操作,用来对一个数进行按位取反运算。
4. IEOR:按位异或操作,用来对两个数进行按位异或运算。
三、按位操作函数的语法和用法按位操作函数的语法非常简单,一般形式如下:result = IAND(a, b) // 对a和b进行按位与操作,将结果赋值给result按位操作函数的用法也很直观,只需要将需要进行按位操作的数作为参数传入即可。
例如:result = IOR(a, b) // 对a和b进行按位或操作,将结果赋值给result四、按位操作函数的示例下面是一个简单的示例,演示了按位操作函数的基本用法:program bitwise_operationimplicit noneinteger :: a, b, result_and, result_or, result_not, result_eora = 5b = 3result_and = IAND(a, b)result_or = IOR(a, b)result_not = NOT(a)result_eor = IEOR(a, b)print*, 'Result of IAND: ', result_andprint*, 'Result of IOR: ', result_orprint*, 'Result of NOT: ', result_notprint*, 'Result of IEOR: ', result_eorend program bitwise_operation在这个示例中,我们定义了两个整数a和b,然后分别对它们进行了按位与、按位或、按位非和按位异或操作,并将结果打印输出。
fortran编程的步骤

fortran编程的步骤Fortran编程的步骤一、引言Fortran(Formula Translation)是一种高级程序设计语言,特别适用于科学计算和数值计算。
本文将介绍Fortran编程的步骤,帮助初学者了解如何使用Fortran进行程序开发。
二、编写程序的基本步骤1. 确定程序的目标:在开始编写Fortran程序之前,需要明确程序的目标和需求。
确定程序的输入和输出,以及所需的计算或处理步骤。
这有助于确保编写的程序能够满足预期的功能和要求。
2. 设计算法和数据结构:根据程序的目标,设计合适的算法和数据结构。
算法描述了解决问题的步骤和逻辑,而数据结构则定义了程序中使用的数据类型和数据组织方式。
3. 编写代码:根据算法和数据结构的设计,开始编写Fortran代码。
Fortran使用特定的语法和语句结构,需要熟悉其语法规则和常用的编程技巧。
代码的编写应遵循良好的编码风格,包括适当的缩进、注释和命名规范。
4. 编译程序:编写完Fortran代码后,需要使用Fortran编译器将源代码转换成可执行的机器代码。
编译过程将检查代码中的语法错误和逻辑错误,并生成可执行文件。
Fortran编译器通常会提供丰富的编译选项,可以根据需要进行调整。
5. 调试和测试:编译成功后,可以对程序进行调试和测试。
调试是指查找和修复程序中的错误和问题,测试是指验证程序的正确性和性能。
调试和测试是编程过程中不可或缺的环节,可以使用调试器和测试框架等工具辅助进行。
6. 优化和性能调整:在程序调试和测试完成后,可以考虑对程序进行优化和性能调整。
优化旨在改进程序的执行效率和资源利用率,可以通过改进算法、调整编译选项和使用高级优化技术来实现。
7. 文档撰写:在编程过程中,应及时记录程序的设计和实现细节。
文档可以包括程序的功能描述、算法和数据结构的说明、代码注释和使用说明等。
良好的文档可以提高代码的可读性和可维护性,并方便其他人理解和使用程序。
fortran数组赋值

fortran数组赋值Fortran 数组赋值Fortran 是一种广泛应用于科学和工程计算领域的编程语言。
其中的数组赋值是一个非常重要的概念,在许多计算任务中都得到了广泛的应用。
在本篇文章中,我们将一步一步地回答有关Fortran 数组赋值的问题,并详细说明其在计算领域的应用。
1. 什么是数组?在Fortran 中,数组是一种用于存储和处理一组相同类型数据的数据结构。
它可以是一维、二维,甚至是更高维度的。
例如,我们可以定义一个一维数组来存储一组年龄数据,或者定义一个二维数组来存储一个矩阵。
2. 如何声明和初始化数组?在Fortran 中,我们可以使用DIMENSION 语句来声明数组的大小,并使用DATA 语句来初始化数组的值。
例如,以下代码声明了一个长度为5 的一维整数数组,并将其初始化为1、2、3、4 和5:INTEGER, DIMENSION(5) :: arrDATA arr /1, 2, 3, 4, 5/3. 如何对数组进行赋值?Fortran 提供了多种方式来对数组进行赋值。
最常见的方式是通过循环语句逐个赋值。
例如,以下代码将数组`arr` 中的每个元素加一:DO i = 1, 5arr(i) = arr(i) + 1END DO通过这种方式,我们可以对数组中的每个元素进行特定的操作,例如加减乘除、求平方等。
4. 如何使用数组赋值表达式?除了使用循环语句逐个赋值外,Fortran 还提供了数组赋值表达式的方式,可以快速地对整个数组进行赋值。
例如,我们可以使用如下方式为数组`arr` 赋予相同的值:arr = 0这将使`arr` 中的每个元素均被赋值为零。
类似地,我们也可以通过使用特定的表达式来对整个数组进行赋值,例如:arr = 2 * arr + 1这将对数组中的每个元素进行相应的操作。
5. 如何进行数组的切片赋值?在Fortran 中,我们还可以使用切片操作符`:` 来对数组的子集进行赋值。
批处理BAT脚本中for命令的使用方法

@echo off for /r "C:\Test\" %%i in (*.txt) do ( echo %%i ) pause C:\Test>test.bat C:\Test\0.txt C:\Test\Folder1\1_1.txt C:\Test\Folder1\Sub1_1\1_1_1.txt C:\Test\Folder2\2_1.txt 请按任意键继续. . .
6/25
内容概要
• • • • • for for /d for /r for /l for /f 处理文件 处理文件夹 枚举目录树处理文件 处理数字序列 处理字符串、命令输出和文本内容
7/25
for /d 命令的基本语法
for /d %%variable in (set) do command
for %%variable in (set) do command
控制变量: • 区分大小写 • 推荐使用单个英文字母 • 不建议使用数字 • BAT脚本里面使用%%i • CMD窗口里面使用%i 文件集合: • 一个或多个文件 • 可以使用通配符 • 需要放在圆括号里面 • 不判断文件是否真实存 在 需要执行的命令: • 多行命令需要放在圆括 号里面 • BAT脚本里面使用 @echo off 之后不需要使 用多余的@来关闭回显
8/25
添加 /r 可以枚举子文件夹
@echo off for /r "C:\Test\" /d %%i in (*) do ( echo %%i ) pause
C:\Test>test.bat C:\Test\Folder1 C:\Test\Folder2 C:\Test\Folder1\Sub1_1 请按任意键继续. . .
Fortran6.5 使用流程

简单说明一次编译程序的过程:1.建立一个新的Project(File-new-选择Project选项卡-Utility Project,给定project的名称),确定生成Project。
2.生成一个新的程序文件(File-new-选择Files选项卡-Fortran Free Format Source File,给定文件名),或是插入一个已有的程序文件(选项Project/Add to Project/Files).3.用Build菜单中的Excute选项来编译并运行程序,或是只单击Build选项来只做编译,不运行程序。
4.要写新的程序可以另外建立一个新的Project,或是直接跟换Project中的文件。
千万不要把两个独立的程序文件放入同一个Project中,否则导致编译过程出现错误。
5.下次修改程序时,可以直接使用File/Open Workspace来打开*.dsw的Project工程文件。
一、安装Fortran6.5安装包中包括以下文件(夹)本人电脑-x86 64位-win7进入X86文件夹,运行,中间需要输入序列号,记事本打开获取,进过中间一些文件位置的选择,到百分之九十多的时候,需要选择是否安装运行环境,选是,最后安装完成。
二、运行开始---Compaq Visual Fortran 6---Developer Studio如果提示打开失败,则选中Developer Studio,右键----管理员获得所有权---就可以了三、打开出现如下对话框:熟悉一些tips:第一条:If your program hangs应用程序瘫痪while running outside the debugger在调试器外运行程序, attach贴上、附加the debugger调试器to your program程序by choosing Start Debug调试、除错form the Build menu, and then choosing Attach to Process.如果你的程序在调试器外运行,导致应用程序瘫痪,通过选择Build---Start Dubug---attach to program,讲调试器连接到你的程序。
fortran format用法
fortran format用法1.引言1.1 概述Fortran是一种编程语言,由IBM公司于1950年代开发。
它被广泛应用于科学计算和数值分析领域,尤其在大规模计算和高性能计算方面表现出色。
Fortran语言的一个重要特性是它的格式化输出功能,即Fortran Format。
Fortran Format是一种格式控制语句,用于指定数据的输出或输入格式。
它可以精确地控制数据的显示方式,包括字段宽度、数值精度、对齐方式等。
通过使用Fortran Format,程序员可以轻松地格式化输出数据,使其更易于阅读和理解。
在Fortran程序中,可以使用一些特定的符号和代码来定义格式控制语句。
例如,可以使用A表示字符型数据、I表示整型数据、F表示浮点型数据等。
通过在格式控制语句中使用这些符号和代码,可以将不同类型和长度的数据格式化为适合打印或写入文件的形式。
除了基本的数据类型,Fortran Format还提供了许多其他功能,如控制字段宽度、指数表示法、对齐方式、填充字符等。
这些功能使得程序员能够自定义数据的输出格式,满足特定需求。
Fortran Format在科学计算和数据处理中扮演着重要的角色。
它可以帮助程序员更好地展示和共享计算结果,提高代码的可读性和可维护性。
此外,由于Fortran Format提供了丰富的格式化选项,它还可以用于数据文件的读写操作。
本文将介绍Fortran Format的基本概念和常用用法。
首先,我们将讨论Fortran Format的基本原理和语法规则。
然后,我们将探讨一些常见的格式化选项,包括字段宽度控制、数值精度控制和对齐方式控制等。
最后,我们将总结Fortran Format的重要性,并展望它在未来发展中的潜力。
通过本篇文章的阅读,读者将能够全面了解Fortran Format的用法和作用,提高对Fortran编程的理解和应用能力。
无论是初学者还是有一定经验的程序员,都可以从中获益,使其编写的Fortran程序更加出色和实用。
批处理for循环秒用
一、命令格式FOR参数%%变量名IN (相关文件或命令)DO执行的命令参数:FOR有4个参数/d /l /r /f 它们的作用将在下文给出实例介绍;%%变量名:这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给它;IN:是命令的格式,照写就是了;(相关文件或命令) :FOR要把什么东西读取然后赋值给变量;do:命令的格式,照写就是了;执行的命令:对每个变量的值要执行什么操作就写在这;二、参数详细介绍/D:仅为目录,如果Set 设置变量,将对与Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的Command。
看下面的例子@echo offfor /d %%i in (*) do @echo %%i上述命令的作用:把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!在看例子,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来@echo offfor /d %%i in (???) do @echo %%i命令作用:当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了/D参数只能显示当前目录下的目录名字,这个大家要注意!/R:递归,进入根目录树[Drive:]Path,在树的每个目录中执行for 语句。
如果在/R 后没有指定目录,则认为是当前目录。
如果Set 只是一个句点(.),则只枚举目录树。
功能:可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字!@echo offfor /r c:\ %%i in (*.exe) do @echo %%i命令的作用:把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了,这里的c:\就是目录了。
再看一个:@echo offfor /r %%i in (*.exe) do @echo %%i注意:参数不一样了,这个命令前面没加那个C:\;也就是没有指定搜索路径,这样它就会以当前目录为搜索路径。
批处理命令——for
批处理命令——for【1】for命令简介 先把for循环与for命令类⽐⼀下,这样学习理解快。
for 循环语句,⼀般格式如下:1for (表达式1;表达式2;表达式3)2 {3循环体;4 } 1. 表达式1 ⼀般为初始状态赋值表达式,给控制变量赋初值。
2. 表达式2 ⼀般为关系表达式或逻辑表达式,为循环控制条件。
3. 表达式3 ⼀般为每次执⾏循环体后向控制变量重新赋值的表达式(给控制变量增量或减量)。
4. 语句:循环体,⼀般为复合语句(即可能需要执⾏多条语句)。
举个实例:1for (int i=0; i < 100; ++i)2 {3 cout << i << endl;4 } for 命令,⼀般格式如下: 在cmd窗⼝中使⽤格式:FOR %variable IN (set) DO command [command-parameters] 在批处理脚本中使⽤格式:FOR %%variable IN (set) DO command [command-parameters] 1. 在cmd窗⼝中使⽤,变量名必须⽤单%引⽤(即:%variable);在批处理脚本中使⽤,变量名必须⽤双%引⽤(即:%%variable)。
2. for、in和do是for命令的三个关键字,缺⼀不可。
3. 关键字in之后,do之前的括号不能省略。
举个实例:新建⼀个⽂本⽂件,命名为fordemo,修改⽂件类型为bat,⽤Notepad++打开编辑内容为:1@echo off2for %%i in (1 2 3 4 5) do@echo %%i3pause>nul 执⾏结果: 嗯哼,原来for命令就这么简单?嗨,同学,不要浮躁,保持冷静,更要理智。
下⾯,且看对上例语句的分析: 从命令组成结构由左向右剖析,除过关键字,依次分别为: 1. 变量名为i,i太简单,作为变量名不具备见名知意的特点。
批处理命令For循环命令详解
分类:2010-06-11 13:0416793人阅读0批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能看看他的基本格式这里我引用的是批处理中的格式,直接在命令行只需要一个%号FOR 参数%%变量名IN 相关文件或命令DO 执行的命令参数:FOR有4个参数/d /l /r /f 他们的作用我在下面用例子解释%%变量名:这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他;IN:命令的格式,照写就是了;相关文件或命令:FOR要把什么东西读取然后赋值给变量,看下面的例子do:命令的格式,照写就是了执行的命令:对每个变量的值要执行什么操作就写在这.可以在CMD输入for /看系统提供的帮助对照一下FOR %%variable IN set DO command command-parameters%%variable 指定一个单一字母可替换的参数;set 指定一个或一组文件;可以使用通配符;command 指定对每个文件执行的命令;command-parameters为特定命令指定参数或命令行开关;现在开始讲每个参数的意思/d仅为目录如果Set 也就是我上面写的"相关文件或命令" 包含通配符和,将对与Set 相匹配的每个目录而不是指定目录中的文件组执行指定的Command;系统帮助的格式:FOR /D %%variable IN set DO command他主要用于目录搜索,不会搜索文件,看这样的例子echo offfor /d %%i in do echo %%ipause把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来echo offfor /d %%i in do echo %%ipause这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了思考题目:echo offfor /d %%i in window do echo %%ipause保存到C盘下执行,会显示什么呢自己看吧/D参数只能显示当前目录下的目录名字,这个大家要注意/R递归进入根目录树Drive:Path,在树的每个目录中执行for 语句;如果在/R 后没有指定目录,则认为是当前目录;如果Set 只是一个句点 .,则只枚举目录树;系统帮助的格式:FOR /R drive:path %%variable IN set DO command上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢放心他比/D强大多了他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子echo offfor /r c:/ %%i in .exe do echo %%ipause咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了,这里的c:/就是目录了;再来一个echo offfor /r %%i in .exe do echo %%ipause参数不一样了,这个命令前面没加那个C:/也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他防灾d:/test目录下执行,那么他就会把D:/test目录和他下面的子目录的全部EXE文件列出来/L迭代数值范围使用迭代变量设置起始值Start,然后逐步执行一组范围的值,直到该值超过所设置的终止值End;/L 将通过对Start 与End 进行比较来执行迭代变量;如果Start 小于End,就会执行该命令;如果迭代变量超过End,则命令解释程序退出此循环;还可以使用负的Step 以递减数值的方式逐步执行此范围内的值;例如,1,1,5 生成序列1 2 3 4 5,而5,-1,1 则生成序列5 4 3 2 1;语法是:系统帮助的格式:for /L %% Variable in Start,Step,End do Command例如:echo offfor /l %%i in 1,1,5 do echo %%ipause保存执行看效果,他会打印从1 2 3 4 5 这样5个数字1,1,5这个参数也就是表示从1开始每次加1直到5终止再看这个例子echo offfor /l %%i in 1,1,5 do start cmdpause执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵如果把那个1,1,5改成1,1,65535会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了名字为1-65535 看完这个被我赋予破坏性质的参数后,我们来看最后一个参数/f含有/F的for详细说明含有/F的for有很大的用处,在批处理中使用的最多,用法如下:格式:FOR /F "options" %%i IN file DO commandFOR /F "options" %%i IN "string" DO commandFOR /F "options" %%i IN 'command' DO command这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果;file代表一个或多个文件string 代表字符串command代表命令"options" 可选对于FOR /F %%i IN file DO commandfile为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子;假如文件中有如下内容:第1行第1列第1行第2列第1行第3列第2行第1列第2行第2列第2行第3列第3行第1列第3行第2列第3行第3列你想显示中的内容,会用什么命令呢当然是type,typefor也可以完成同样的命令:for /f %%i in do echo %%i还是先从括号执行,因为含有参数/f,所以for会先打开,然后读出里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,{“第1行第1列第1行第2列第1行第3列”, 1行第1列第1行第2列第1行第3列.第2行第1列第2行第2列第2行第3列第3行第1列第3行第2列第3行第3列执行for /f "eol=. tokens=" %%i in do echo %%i结果是:第3行第1列第3行第2列第3行第3列用eol来告诉for忽略以“.”开头的行;同样也必须加tokens=,否则只会显示“第3行第1列======================================================终极dos批处理循环命令详解格式:FOR 参数%%变量名IN 相关文件或命令DO 执行的命令作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果;注意:在批处理文件中使用FOR 命令时,指定变量请使用%%variable,而不要用%variable;变量名称是区分大小写的,所以%i 不同于%I.关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f下面分别解释一下===零:无参数时:---FOR %variable IN set DO command command-parameters%variable 指定一个单一字母可替换的参数;set 指定一个或一组文件;可以使用通配符;command 指定对每个文件执行的命令;command-parameters为特定命令指定参数或命令行开关;TTT示例:for %%i in t. do echo %%i --显示当前目录下与t.相匹配的文件只显示文件名,不显示路径for %%i in d:/mydocuments/.doc do echo %%i --显示d:/mydocuments/目录下与.doc 相匹配的文件===一、参数/d 参数只能显示当前目录下的目录名字格式:FOR /D %variable IN set DO command command-parameters这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字;TTT特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录;TTT示例:for /d %%i in c:/ do echo %%i --显示c盘根目录下的所有目录for /d %%i in do echo %%i --显示当前目录下名字只有1-3个字母的目录===二、参数/R 搜索指定路径及所有子目录中与set相符合的所有文件---格式:FOR /R drive:path %variable IN set DO command command-parameters此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录;1、set中的文件名如果含有通配符或,则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举;2、如果set中为具体文件名,不含通配符,则枚举该目录树即列举该目录及其下面的所有子目录并在后面加上具体的文件名,而不管set中的指定文件是否存在;例:for /r c:/ %%i in .exe do echo %%i --把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了TTT示例:for /r c:/ %%i in do echo %%i --枚举了c盘所有目录for /r d:/backup %%i in 1 do echo %%i --枚举d/backup目录for /r c:/ %%i in do if exist %%i echo %%i --很好的搜索命令,列举存在的目录三、参数/L 该集表示以增量形式从开始到结束的一个数字序列;可以使用负的Step---格式:FOR /L %variable IN start,step,end DO command command-parameters该集表示以增量形式从开始到结束的一个数字序列;可以使用负的StepTTT示例:for /l %%i in 1,1,5 do echo %%i --输出1 2 3 4 5for /l %%i in 1,2,10 do echo %%i --输出1,3,5,7,9for /l %%i in 100,-20,1 do echo %%i --输出100,80,60,40,20for /l %%i in 1,1,5 do start cmd --打开5个CMD窗口for /l %%i in 1,1,5 do md %%i --建立从1~5共5个文件夹for /l %%i in 1,1,5 do rd /q %%i --删除从1~5共5个文件夹四、参数/F 使用文件解析来处理命令输出、字符串及文件内容;---这个参数是最难的,参数又多,先简单的解释一下:for命令带这个参数可以分析文件内容,字符串内容或某一命令输出的结果,并通过设置option得我们想要的结果;以下是某高手的解释,感觉有点太专业了,自认为不太容易理解,也列一下:迭代及文件解析--使用文件解析来处理命令输出、字符串及文件内容;使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式;使用options令牌选项指定哪些令牌应该作为迭代变量传递;请注意:在没有使用令牌选项时,/F 将只检查第一个令牌;文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌;然后通过设置为令牌的迭代变量值,调用for 循环;默认情况下,/F 传递每个文件每一行的第一个空白分隔符号;跳过空行;+++格式:FOR /F "options" %variable IN file-set DO command command-parametersFOR /F "options" %variable IN "string" DO command command-parametersFOR /F "options" %variable IN 'command' DO command command-parameters或者,如果有usebackq 选项:FOR /F "options" %variable IN file-set DO command command-parametersFOR /F "options" %variable IN "string" DO command command-parametersFOR /F "options" %variable IN 'command' DO command command-parametersTTT说明:以上是WinXP系统中的帮助内容,你可以注意到,两者完全相同,这其实是系统的错误,第二段“如果有usebackq 选项:”应该以下的内容:FOR /F "options" %variable IN "file-set" DO command command-parametersFOR /F "options" %variable IN 'string' DO command command-parametersFOR /F "options" %variable IN `command` DO command command-parameters--`command`中的引号为反引号,是键盘上数字1左面的那个键+++TTT说明:下面是详细的解释,大部分是系统中的帮助内容,也有些错误怪不得for命令这么难学,已经被我纠正了;1 OPTION关键字详解:eol=c:指一个行注释字符的结尾就一个;例如:eol=; --忽略以分号打头的那些行;skip=n:指在文件开始时忽略的行数;例如:skip=2 --忽略2行;delims=xxx:指分隔符集;这个替换了空格和跳格键的默认分隔符集;例如:delims=, --指定用逗号,空格对字符串进行分隔;tokens=x,y,m-n:指每行的哪一个符号被传递到每个迭代的for 本身;这会导致额外变量名称的分配;m-n格式为一个范围;通过nth 符号指定mth;如果符号字符串中的最后一个字符是星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本;例如:tokens=2,3 --将每行中的第二个和第三个符号传递给for 程序体;tokens=2,3 ... i% --将会把取到的第二个字符串赋给i%,第三个赋给j%,剩下的赋给k%;关于usebackq,不同版本的系统提示不同的帮助,不过都有助于理解,所以都摘抄如下:1,usebackq:使用后引号键盘上数字1左面的那个键`;未使用参数usebackq时:file-set 表示文件,不能加引号,所以不能含有空格;加双引号表示字符串,即"string";加单引号表示执行命令,即'command';使用参数usebackq时:file-set和"file-set"都表示文件,当文件路径或名称中有空格时,就可以用双引号括起来;单引号表示字符串,即'string';后引号表示命令执行,即`command`;此段是WinXP系统中的帮助2,usebackq:指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串;并且一个单引号字符为文字字符串命令;并允许在filenameset中使用双引号扩起文件名称;以上两条结合着看,其实已经可以明白了,我再说明一下:其实这个参数的目的就是为了处理带有空格的文件名;如果您要处理的文件名和路径中含有空格,如果直接使用,会提示找不到文件;如果你用双引号将文件名和路径括起来;这时候将作为字符串处理,而不是作为文件了;为了应对这种情况,所以才增加了这个“usebackq”参数;如果使用了这个参数,对于括号中的加双引号的集合,系统就可以认为是文件了;真正的字符串要加单引号;命令要加反引号;2 file-set 为一个或多个文件名;继续到file-set 中的下一个文件之前,每份文件都已被打开、读取并经过处理;处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号;然后用已找到的符号字符串变量值调用For 循环;以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号;跳过空白行;您可通过指定可选"options"参数替代默认解析操作;这个带引号的字符串包括一个或多个指定不同解析选项的关键字;3 %i:专门在for 语句中得到说明,%j 和%k 是通过tokens= 选项专门得到说明的;您可以通过tokens= 一行指定最多26 个符号,只要不试图说明一个高于字母'z' 或'Z' 的变量;请记住,FOR 变量是单一字母、分大小写和全局的;而且,同时不能有52 个以上都在使用中;TTT补充说明:一般在tokens后只指定第一个参数,如%%i或%%a,在后面使用第二个及两个以上的参数,自动按顺序往下排即可;如前面指定的是%%a,后面则用%%b代表第二个结果,%%c代表第三个结果;;;测试了一下tokens后指定多个变量名,没有测试成功,应该是不可以的;所以token后只能跟要使用的第一个变量名如果使用的变量名超过了%z或%Z,就无法使用了,曾经以为会循环过来:如%%z后可以使用%%a或%%A,但经测试,这是不可以的;如:for /f "tokens=1,2,3 delims=-, " %%y in "aa bb,cc-dd ee" doecho %%y %%z %%A %%a --只会输出前两个字符串,后面的两个变量是无效的;+++以下是系统提供的范例:FOR /F "eol=; tokens=2,3 delims=, " %i in do echo %i %j %k --说明:会分析中的每一行,eol=; --忽略以分号打头的那些行;tokens=2,3 --将每行中的第二个和第三个符号传递给for 程序体;delims= , --用逗号和/或空格定界符号;%i --这个for 程序体的语句引用%i 来取得取得的首个字符串本例中为第二个符号,引用%j 来取得第二个字符串本例中为第三个符号引用%k来取得第三个符号后的所有剩余符号;TTT说明:上述例子和说明中明显的错误,%i应该换为%%i帮助中有明确的说明:指定变量请使用%%variable,而不要用%variable,误导+++TTT:下面列我做的几个例子:1,分析文件的例子FOR /F "eol=; tokens=1,2 delims=,- " %%i in d:/ do echo %%i %%j %%k2,分析字符串的例子:for /f "tokens=1,2,3 delims=-, " %%i in "aa bb,cc-dd ee" do echo %%i %%j %%k %%l 3,分析命令输出的例子:FOR /F "tokens=1 delims==" %%i IN 'set' DO echo %%i----%%j如果使用了usebackq参数后,命令如下,结果与上面的完全相同;1,分析文件的例子FOR /F "usebackq eol=; tokens=1,2 delims=,- " %%i in "d:/" do echo %%i %%j %%k 2,分析字符串的例子:for /f "usebackq tokens=1,2,3 delims=-, " %%i in 'aa bb,cc-dd ee' doecho %%i %%j %%k %%l3,分析命令输出的例子:会枚举当前环境中的环境变量名称和值;FOR /F "usebackq tokens=1 delims==" %%i IN `set` DO echo %%i----%%j结果大家可以试一下,很容易就明白的;===FOR命令中的变量---FOR 变量参照的替换已被增强;您现在可以使用下列选项语法:~I - 删除任何引号",扩充%I%~fI - 将%I 扩充到一个完全合格的路径名%~dI - 仅将%I 扩充到一个驱动器号%~pI - 仅将%I 扩充到一个路径%~nI - 仅将%I 扩充到一个文件名%~xI - 仅将%I 扩充到一个文件扩展名%~sI - 扩充的路径只含有短名%~aI - 将%I 扩充到文件的文件属性%~tI - 将%I 扩充到文件的日期/时间%~zI - 将%I 扩充到文件的大小%~$PATH:I - 查找列在路径环境变量的目录TTT提示:是环境变量path的目录,并将%I 扩充到找到的第一个完全合格的名称;如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串此外,还可以组合修饰符来得到多重结果:%~dpI - 仅将%I 扩充到一个驱动器号和路径%~nxI - 仅将%I 扩充到一个文件名和扩展名%~fsI - 仅将%I 扩充到一个带有短名的完整路径名%~dp$PATH:i - 查找列在路径环境变量的目录,并将%I 扩充到找到的第一个驱动器号和路径;%~ftzaI - 将%I 扩充到类似输出线路的DIR在以上例子中,%I 和PATH 可用其他有效数值代替;%~ 语法用一个有效的FOR 变量名终止;选取类似%I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆;以上是系统帮助的内容我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,例如:FOR /F "usebackq eol=; tokens=1,2 delims=,- " %%x in "d:/" doecho %%x %%y %%z这里我们就要把那个x,y,z改成%~fx,%~fy,%~fz;+++TTT特例:以下是我根据以上说明作的一个综合的例子,可以直接复制到记事本里,保存为bat格式c盘下任一目录,运行后,可以直观的看到扩展后的效果;echo offecho ---显示"dir c:/ /b /ah"for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 不扩展变量%%ifor /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~fI %%~fi --扩充到一个完全合格的路径名for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~dI %%~di --仅将变量扩充到一个驱动器号for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~pI %%~pi --仅将变量扩充到一个路径for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~nI %%~ni --仅将变量扩充到一个文件名for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~xI %%~xi --仅将变量扩充到一个文件扩展名for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~sI %%~si --扩充的路径只含有短名for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~aI %%~ai --将变量扩充到文件的文件属性for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~tI %%~ti --将变量扩充到文件的日期/时间for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~zI %%~zi --将变量扩充到文件的大小for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~$PATH:I %%~$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个完全合格的名称echo ---以下显示组合修饰符来得到多重结果---:for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~dpI %%~dpi --仅将变量扩充到一个驱动器号和路径for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~nxI %%~nxi --仅将变量扩充到一个文件名和扩展名for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~fsI %%~fsI --仅将变量扩充到一个带有短名的完整路径名for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个驱动器号和路径for /f "delims==" %%i in 'dir c:/ /b /ah' do echo 扩展变量到~ftzaI %%~ftzai --将变量扩充到类似输出线路的DIRecho.echo ---显示"dir C:/WINDOWS/system32/ /b"for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 不扩展变量%%ifor /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~fI %%~fi --扩充到一个完全合格的路径名for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~dI %%~di --仅将变量扩充到一个驱动器号for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~pI %%~pi --仅将变量扩充到一个路径for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~nI %%~ni --仅将变量扩充到一个文件名for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~xI %%~xi --仅将变量扩充到一个文件扩展名for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~sI %%~si --扩充的路径只含有短名for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~aI %%~ai --将变量扩充到文件的文件属性for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~tI %%~ti --将变量扩充到文件的日期/时间for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~zI %%~zi --将变量扩充到文件的大小for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~$PATH:I %%~$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个完全合格的名称echo ---以下显示组合修饰符来得到多重结果---:for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~dpI %%~dpi --仅将变量扩充到一个驱动器号和路径for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~nxI %%~nxi --仅将变量扩充到一个文件名和扩展名for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~fsI %%~fsI --仅将变量扩充到一个带有短名的完整路径名for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个驱动器号和路径for /f "delims==" %%i in 'dir C:/WINDOWS/system32/ /b' do echo 扩展变量到~ftzaI %%~ftzai --将变量扩充到类似输出线路的DIRTTT说明:1,以上命令中,%%~fsI无法显示,估计是系统错误,因为%%~fI是扩充到一个完全合格的路径名,%%~sI只含有短文件名,本身是相互矛盾的,所以出错;不知是系统的错误还是在考我们~~2,以上命令如果保存在别的盘中,无法显示正确的驱动器和路径;3,如果想要%%~dp$PATH:i正常显示,要保证环境变量path中确实有这个路径:C:/WINDOWS/system32;下面依次说明一下:+++一、~I - 删除任何引号",扩展%I---这个变量的作用就如他的说明,删除引号删除引号规则如下BAT兄补充:1、若字符串首尾同时存在引号,则删除首尾的引号;2、若字符串尾不存在引号,则删除字符串首的引号;3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除;龙卷风补充:无头不删,有头连尾删;我们来看这个例子,首先建立临时文件,内容如下"1111"2222"3333""55"55"55也可建立个BAT文件代码如下:echo offecho ^"1111>echo "2222">>echo 3333^">>echo "4444"44>>echo ^"55"55"55>>rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格FOR /F "delims=" %%i IN DO echo %%~ipausedel执行后,我们看CMD的回显如下:1111 字符串前的引号被删除了2222 字符串首尾的引号都被删除了3333" 字符串前无引号,后面的引号保留4444"44 字符串前面的引号删除了,而中间的引号保留55"55"55 字符串前面的引号删除了,而中间的引号保留请按任意键继续. . .结果和之前中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了+++二、%~fI - 将%I 扩展到一个完全合格的路径名示例:把代码保存放在随便哪个地方,我这里就放桌面吧.FOR /F "delims==" %%i IN 'dir /b' DO echo %%~fipause执行后显示内容如下C:/Documents and Settings/Administrator/桌面/C:/Documents and Settings/Administrator/桌面/当我把代码中的%%~fi直接改成%%iFOR /F "delims==" %%i IN 'dir /b' DO echo %%ipause执行后就会显示以下内容:通过对比,我们很容易就看出没有路径了,这就是"将%I 扩展到一个完全合格的路径名"的作用,也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打印一个文件名,自己动手动实验下就知道了+++三、%~dI - 仅将%I 扩展到一个驱动器号看例子:代码如下,我还是放到桌面执行FOR /F "delims==" %%i IN 'dir /b' DO echo %%~dipause执行后我CMD里显示如下C:C:我桌面就两个文件,,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件或者目录所在的盘符号打印出来+++四、%~pI - 仅将%I 扩展到一个路径这个用法和上面一样,他只打印路径不打印文件名字FOR /F "delims==" %%i IN 'dir /b' DO echo %%~pipause我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧+++五、%~nI - 仅将%I 扩展到一个文件名只打印文件名字FOR /F "delims==" %%i IN 'dir /b' DO echo %%~nipause+++六、%~xI - 仅将%I 扩展到一个文件扩展名只打印文件的扩展名FOR /F "delims==" %%i IN 'dir /b' DO echo %%~xi pause+++七、%~sI - 扩展的路径只含有短名打印绝对短文件名FOR /F "delims==" %%i IN 'dir /b' DO echo %%~si pause+++八、%~aI - 将%I 扩展到文件的文件属性打印文件的属性FOR /F "delims==" %%i IN 'dir /b' DO echo %%~ai pause+++九、%~tI - 将%I 扩展到文件的日期/时间打印文件建立的日期FOR /F "delims==" %%i IN 'dir /b' DO echo %%~ti pause+++十、%~zI - 将%I 扩展到文件的大小打印文件的大小FOR /F "delims==" %%i IN 'dir /b' DO echo %%~zipause龙卷风补充:上面例子中的"delims=="可以改为"delims=",即不要分隔符+++十一、%~$PATH:I - 查找列在路径环境变量的目录,并将%I 扩展到找到的第一个完全合格的名称;如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串这是最后一个,和上面那些都不一样,我单独说说然后在把这些代码保存为批处理,放在桌面;echo offFOR /F "delims=" %%i IN “” DO echo %%~$PATH:ipause龙卷风补充:上面代码显示结果为C:/WINDOWS/system32/他的意思就在PATH变量里指定的路径里搜索文件,如果有则会把他所在绝对路径打印出来,没有就打印一个错误TTT说明,保存到桌面上,运行显示结果为:系统找不到文件“”;查看环境变量path中确实有这个路径,不明原因后来发现了,原来是中文引号的原因;上面的命令应该写成:FOR /F "delims=" %%i IN "" DO echo %%~$PATH:i最后发一个用批处理做一五子棋游戏:echo off&setlocal enabledelayedexpansion。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fortran中批量处理文件的方法总结 —循环读取目录下的所有符合条件的文件 ===================== 一、简单的介绍 在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐
日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。
对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!
这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。 我总结的批处理方法大概可以用下面这个示意图来说明: | | |将文件目录写入一个文本文件,供fortran循环读取 |————手动输入文件名 |————运行程序之前命令行工具导出文件名 |————程序运行后,未开始计算之前,生成文件名 | ————调用CMD命令生成 | ————GETFILEINFOQQ方法生成 | ————调用WIN32API生成 | |在程序运行时动态生成文件名 | |
对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。第二种方法主要是说明其思路。
二、方法的介绍 1、 将文件目录写入一个文本文件,供fortran循环读取 1.1、 手动输入文件名 这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。 1.2、 运行程序之前命令行工具导出文件名 这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。
a、 从运行工具打开你的CMD窗口; b、转到要处理的当前目录(可省略):CD /d 路径,如:
CD /d e:\test 这样可以快速到达e:\test目录
c、 使用DIR命令列出文件目录信息到指定的文件,通常使用的 Dir *.*>新文件名 这个命令在这里已经不能满足要求,因为会列出一堆对于我们处理而言无用的信息,现在要使用的命令是: DIR /b filter>newfile 注意,其中的filter为文件筛选,必须自己修改为所需的,比如你可以把它改成*.txt,这样,就会列出当前目录下的所有txt结尾的文件了。
Newfile就是你需要存放文件名的那个文件,比如可以是 dir.txt,这样就成了 dir /b*.txt>dir.txt,就会把当前目录下的所有文件都列出到dir.txt文件中,当然,由于dir.txt也在当前目录,所以也会被算进去,这在处理的时候是需要注意的,下面几种方法中同样考虑了这个问题。你可以选择手动删掉,或者把dir.txt这个文件存到其他地方去,或者,不要和你需要的文件具有相同的后缀也行,比如:dir /b *.txt>e:\dir.txt (假设当前目录是e:\test)
如果省略了第二步中的转到当前目录的话,就需要在dir命令后输入完整的路径了,而且新生成的文件也要选择有权限建立新文件的地方存放,比如你在c:\users目录下输入:dir /b e:\test\*.txt>e:\dir.txt,这个命令和上面先转到e:\test目录下的效果是一样的。 现在你是不是比较好奇,/b 是干嘛的,其实就是只列出文件名,不要其他的附件信息,比如创建时间,文件大小等等这些对于我们批处理无关的信息。 如果你想包含某个目录下的子目录,那么,就可以这样写:
Dir /b/s filter>newfile /s就表示包含子目录,但是,这样会有一个问题,那就是,批处理的时候必
须获得正确的路径才能操作,这样得到的子目录里面的文件不会有任何标志说他是来自子目录的,因此fortran处理的时候就无法判断了,所以,如果包含了子目录,那么请用下面的命令:
Dir /a-d/b/s filter>newfile 现在去看看新生成的文件吧,怎么样,很惊喜吧!
懂了这个方法,下面一部分的第一个方法对你来说就是小菜一碟啦。 如果你使用的win7(或vista)系统,而且无法正常使用CVF编译器的话,那么第一部分到这里就算结束啦,除非,你会在其他fortran编译器中调用WIN32API。
1.3、程序运行后,未开始计算之前生成文件名 1.3.1、在程序中调用CMD命令 这个方法其实就是上一个方法的进化版,只不过变成了在程序运行的时候调用命令自动生成,这样整个过程显得少一点,只需要在程序里设置好相关的参数即可。 这个方法的关键在于SYSTEMQQ函数的使用,这是CVF编译器封装的调
用CMD命令的一个函数,存在于DFLIB库中,其语法命令为:
result = SYSTEMQQ(commandline) commandline:表示需要进行的CMD操作,字符串形式,函数中的实际长度由传入的参数决定,input类型(表示输入为参数);
Results:一个逻辑型变量(logical(4)),如果成功为true,失败为false(不解的是程序中要实现的东西都是正常的,比如仅仅传入dir命令,返回的结果仍然为F,请高手赐教) 给出一个简单的例子: USE DFLIB
LOGICAL(4)result result = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt') 这个命令将第一个路径中的文件复制到为第二个路径中的文件。通过这个例子再结合上面一个方法,就可以很方法便的构造出我们需要用来批处理的子函数,关键语句如下所示:
subroutine ListToFile(fPath,outPut) character*(*),InTent(In):: fPath,outPut character*100CMD LOGICAL(4) res CMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut) res=SYSTEMQQ(CMD) endsubroutine
其中传入的是文件筛选值和输出的路径,这个方法也是我在第一部分中最
为推荐的一个方法了,代码简洁高效,能够输出完整的路径,可以包含子文件夹,唯一的缺点就是输出的文件个数不能直接在程序中调用(方便循环),需要在批处理的时候使用其他方法来判断文件是否读取结束。
1.3.2、使用GETFILEINFOQQ方法生成文件目录 该方法是下面一个方法的进化版,是由CVF对WIN32的API进行了封装,这样,我们就可以通过简单的调用函数来实现一些面向对象的功能。简单的翻译了一下官方给出的GETFILEINFOQQ函数信息: Module: USE DFLIB (存在于DFLIB库中)
语法简介: Syntax
result = GETFILEINFOQQ (files, buffer, handle)
files :输入类型的字符型变量,表示你需要查找的路径(也就是我们上面方法中
的筛选值),同样可以使用*或者?这样的通配符。
buffer :在函数运行中会获得一个值,可供输出使用,这个值就是所找到的文件
的相关信息,属于FILE$INFO类型的变量(该类型定义于:fortran安装路径 DF98\INCLUDE路径下),其结构如下: TYPE FILE$INFO INTEGER(4)CREATION INTEGER(4)LASTWRITE INTEGER(4)LASTACCESS INTEGER(4)LENGTH INTEGER(4)PERMIT CHARACTER(255)NAME END TYPE FILE$INFO
handle :接受输入和输出整型变量,表示文件控制信息(同样在DFLIB中定义),
包含以下内容: FILE$FIRST - First matching file found. FILE$LAST - Previous file was the last valid file. FILE$ERROR - No matching file found. Results: 返回值是一个整型变量(integer(4)),表示的不含空格的文件名长度,如果文件未找到,则返回0。
了解了以上信息,我们就可以通过编程进行循环调用这个函数,每找到一个
符合条件的文件,就把他输入到指定路径的文件中去,注意,凡是input类型的变量都必须传入数值,否则会出错。
如果你比较有探索精神,就试着用这个介绍和思路来编程一下吧,子程序如下所示(完整的请下载附件) Subroutine GetFileList(cFileName,outPut,iFile) UseDFLib,only:GetFileInfoQQ,GetLastErrorQQ,FILE$INFO,FILE$LAST,FILE$ERROR,FILE$FIRST,ERR$NOMEM,ERR$NOENT,FILE$DIR !引入库函数 Implicit None !根据上面的语法介绍来定义变量
Character*(*),Intent(In)::cFileName !筛选值