JavaScript innerText与innerHtml与value的区别

  • innerHtml是标签内的文本,输入输出到该DOM内部纯HTML代码,也就是说使用innerHTML,可以在标签里面添加html代码 也就是设置一个元素里面的HTML代码;
  • innerText是id为object的闭合标签内的文本,输入输出的是转义文本(字符串)。也就是说使用innerText可在控件中添加文本,或者读入文本。
  • value**表单元素特有**的属性,输入输出的是转义文本(字符串);非表单元素没有value属性,如div,span等;value在不同表单元素里有不同的意义,如button中为按钮中的文本,input(text)为默认文本,textarea为默认文本。

所以操作表单元素文本内容用value;而innerHTMLinnerText用于操作非表单元素的内容或文本内容。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<center>
<!-- 没有value属性 -->
<div id="20181126161922">
<h3>123</h3>
</div>
<input type="button" onclick="setID20181126161922()" value="showDIV">
</center>
<script>
// id="20181126161922" onclick="setID20181126161922()"
function setID20181126161922() {
var id = document.getElementById("20181126161922");
var str = "innerHTML:" + id.innerHTML +
"\ninnerText:" + id.innerText +
"\nvalue:" + id.value;
alert(str);
}
</script>
</body>
</html>

运行结果

1
2
3
4
innerHTML:
<h3>123</h3>
innerText:123
value:undefined

div中时没有value属性的,所以这里返回的是undefined

参考链接

https://m.baidu.com/mip/c/www.360doc.cn/mip/564782394.html
https://blog.csdn.net/qq_30567891/article/details/60466455
http://www.cnblogs.com/zhang-jiao/p/9589967.html
https://www.jianshu.com/p/2f7942af4acb?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq

正则表达式语法

**在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。**也可以简单的理解在 Java 的正则表达式中,两个\\代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,不过还好,在eclipse中可以把正则表达式直接粘贴到字符串中,eclipse会自动帮我们转义。这样免得我们手动添加转移符。

一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 “Hello World“ 字符串。
正则表达式的特殊字符字符序列如下

普通字符

字母数字汉字下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配个字符串的时候,匹配与之相同的一个字符

简单的转义字符

正则 描述
\n 匹配换行符
\t 匹配制表符
\\ 匹配\本身
\^,\$,\.,\{,\},\?,\+,\*,&#124;,\[,\] 匹配这些字符本身

宇符边界

序号 字符 描述
1 ^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与”\n“或”\r“之后的位置匹配。
2 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与”\n“或”\r“之前的位置匹配。
3 \b 匹配一个字边界,即字与空格间的位置。例如,”er\b“匹配”never“中的”er“,但不匹配”verb“中的”er“。

自定义字符集合

序号 匹配单个字符 描述
1 . 匹配除”\r\n“之外的任何单个字符。若要匹配包括”\r\n“在内的任意字符,请使用诸如”[\s\S]“之类的模式。
2 [xyz] 字符集匹配括号里包含的任意一个字符。例如,”[abc]”匹配”plain“中的”a“。
3 [^xyz] 反向字符集匹配括号里未包含的任何一个字符。例如,”[^abc]“匹配”plain“中”p“,”l“,”i“,”n“,但不会匹配a
4 [a-z] 范围字符集匹配指定范围内的任何一个字符。例如,”[a-z]“匹配”a“到”z“范围内的任何一个小写字母。
5 [^a-z] 反向范围字符集匹配不在指定的范围内的任何一个字符。例如,”[^a-z]“匹配任何不在”a“到”z“范围内的任何字符。

标准字符集合

序号 字符组简写形式 描述
1 \d 数字字符匹配。等效于 [0-9]
2 \D 非数字字符匹配。等效于 [^0-9]
3 \s 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。
4 \S 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。
5 \w 匹配任何的字母,数字,下划线。与”[A-Za-z0-9_]“等效。
6 \W 与任何非单词字符匹配。与”[^A-Za-z0-9_]“等效。

量词

序号 量词 描述
1 ? 匹配前面的子符或子表达**1次或者0次**,例如 zo?匹配z或者zo? 等效于 {0,1}
2 * 匹配前面的字符或子表达式**0次或者多次**。例如,zo* 匹配”z“,”zoo“,”zooo“,...* 等效于 {0,}
3 + 匹配前面的字符或子表达式**1次多次**。例如,”zo+“与”zo“和”zoo“匹配,但与”z“不匹配。+ 等效于 {1,}
4 {n} n 是非负整数。正好匹配 n。例如,”o{2}“与”Bob“中的”o“不匹配,但与”food“中的两个”o“匹配。
5 {n,} n 是非负整数。至少匹配 n。例如,”o{2,}“不匹配”Bob“中的”o“,而匹配”foooood“中的所有 o。”o{1,}”等效于”o+“。”o{0,}“等效于”o*“。
6 {n,m} mn 是非负整数,其中 n <= m匹配至少 n 次,至多 m。例如,”o{1,3}“匹配”fooooood“中的头三个 o。’o{0,1}‘ 等效于 ‘o?‘。注意:您不能将空格插入逗号和数字之间。
7 ? 当此字符紧随任何其他限定符(*+?{n}{n,}{n,m})之后时,匹配模式是”非贪心的”。**”非贪心的”模式匹配搜索到的、尽可能短的字符串而默认的”贪心的”模式匹配搜索到的、尽可能长的字符串。**例如,在字符串”oooo“中,”o+?“只匹配单个”o“,而”o+”匹配所有”o“。

非贪婪匹配量词

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符量词都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?就行了。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

所以,在上面的量词后面都加上问号?,就可以懒惰匹配量词表,如下所示。

懒惰匹配量词 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

分组非捕获分组

列名 列名
() 捕获分组,后面可以使用前向引用来引用
(?:) 非捕获分组

反向引用

序号 反向引用 描述
1 \num 匹配 num,此处的 num 是一个正整数到捕获匹配的反向引用。例如,”(.)\1“匹配两个连续的相同字符。”(a).+\1“匹配axa,abbba等等
2 \n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。
3 $num java中反向引用的写法,用的是美元符号$代替反斜杠\

不可见字符

序号 转义字符 描述
1 \ 将下一字符标记为特殊字符、文本、向引用或反八进制转义符。例如,”n“匹配字符”n“,而”\n“匹配换行符。序列”\\\\“匹配”\\“,”\\(“匹配”(“。
2 \b 匹配一个字边界,所谓字符边界是指所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就是相当于`(?<!\w)(?=\w)
3 \B 非字边界匹配。”er\B“匹配”verb“中的”er“,但不匹配”never“中的”er“。
10 \t 制表符匹配。与 \x09 和 \cI 等效。
11 \v 垂直制表符匹配。与 \x0b 和 \cK 等效。
12 \r 匹配一个回车符。等效于 \x0d 和 \cM。
13 \n 换行符匹配。等效于 \x0a 和 \cJ。
14 \f 换页符匹配。等效于 \x0c 和 \cL。
15 \cx 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Za-z 之间。如果不是这样,则假定 c 就是”c“字符本身。

\b应用场景

基础应用
“\b”一般应用在需要匹配某一单词字符组成的子串,但这一字符不能包含在同样由单词字符组成的更长的子串中。
比如要替换掉一段英文中的单词“to”,而“today”显然不在替换的范围内,所以正则可以用“\bto\b”来限定。
**特殊情况 **
“\b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即
[a-z\b]
此处的“\b”表示的是退格键,而不是单词边界。

进制相关

序号 带进制的转义符 描述
1 \xn 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,”\x41“匹配”A“。”\x041“与”\x04&1“等效。允许在正则表达式中使用 ASCII 代码。
2 \n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。
3 \un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。

零宽断言 环视 前瞻后顾

正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”因为正则引擎已经走过了那一块地方

所谓的前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式,
后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为肯定式匹配否定式匹配
现代高级正则表达式引擎一般都支持都支持前瞻,对于后顾支持并不是很广泛。
java 支持正向后瞻负向后瞻正向前瞻负向前瞻
而javascirpt只支持前瞻,不支持后顾。

表达式 名称 描述
(?=exp) 正向前瞻 匹配后面满足表达式exp的位置
(?!exp) 负向前瞻 匹配后面不满足表达式exp的位置
(?<=exp) 正向后瞻 匹配前面满足表达式exp的位置(JS不支持)
(?<!exp) 负向后瞻 匹配前面不满足表达式exp的位置(JS不支持)
口诀:
  • 有小于号的表示匹配前面,没有的表示匹配后面
  • 等号表示满足
  • 感叹号表示不满足

例如,’Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000” 中的 “Windows” ,但不能匹配 “Windows 3.1” 中的 “Windows”
而’Windows (?!95|98|NT|2000)’”Windows 3.1” 中的 “Windows”,但不能匹配匹配 “Windows 2000” 中的 “Windows”。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args)
{
String text="Java\n"
+ "Javascirpt\n"
+ "PostScirpt\n"
+ "TypeScirpt\n"
+ "HTML\n"
+ "CSS\n"
+ "C\n"
+ "C++\n"
+ "C#\n";
Pattern pattern=Pattern.compile("^(?![cC]).*",Pattern.MULTILINE);
Matcher matcher=pattern.matcher(text);
System.out.println("开头后面没有C的编程语言:");
while(matcher.find())
{
System.out.println(matcher.group());
}
pattern=Pattern.compile("^(.*)(?=Scirpt)(.*)",Pattern.MULTILINE+Pattern.CASE_INSENSITIVE);
matcher=pattern.matcher(text);
System.out.println("尾部带有Script的编程语言:");
while(matcher.find())
{
System.out.println(matcher.group(1)+" "+matcher.group(2));
}
}

运行效果:

1
2
3
4
5
6
7
8
9
10
开头后面没有C的编程语言:
Java
Javascirpt
PostScirpt
TypeScirpt
HTML
尾部带有Script的编程语言:
Java scirpt
Post Scirpt
Type Scirpt

参考链接https://www.cnblogs.com/dong-xu/p/6926064.html
参考链接https://blog.csdn.net/sprayabc/article/details/7868688

应用实例

在数字之间添加点号
最近我在用文字识别工具识别pdf文件上的标题,但是识别的不是很好,经常会把标题中的点号丢失掉。可以用正则表达式把没识别的点号加上。
匹配正则:(?<=\d)(\d),解释,匹配一个数字,这个数字前面有一个数字。
替换正则:.$1,解释:在匹配到的数字前面添加一个点号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//测试数据:
// 3.1.2文档注释
// 31.2文档注释
// 312文档注释
// 3.12文档注释
String code = "312文档注释";
// 在数字中间添加点号
// 匹配一个数字,这个数字前有一个数字
Pattern insert = Pattern.compile("(?<=\\d)(\\d)");
Matcher matcher = insert.matcher(code);
StringBuffer sb = new StringBuffer();
while (matcher.find())
{
matcher.appendReplacement(sb, ".$1");
}
matcher.appendTail(sb);
System.out.println(sb.toString());

运行结果:

1
3.1.2文档注释

参考资料

https://www.jb51.net/article/19330.htm

文档注释可以用于对属性方法等进行说明。 写文档注释时除了需要使用 /** .... */ 限定之外,还需要注意注释内部的一些细节问题。

文档注释的格式化

javadoc生成的文档是HTML格式的,而这些HTML格式的标识符并不是javadoc添加的,而是我们在写注释的时候写上去的。比如,需要换行时,不是敲入一个回车符,而是写入<br> ,如果要分段,就应该在段前写入<p>
文档注释的正文并不是直接复制到输出文件 ( 文档的 HTML 文件),而是读取每一行后,删掉前导的 * 号及*号以前的空格,再输入到文档的。如

1
2
3
4
5
/** 
* This is first line. <br>
***** This is second line. <br>
This is third line.
*/

编译输出后的 HTML 源码则是:

1
2
3
This is first line. <br> 
This is second line. <br>
This is third line.

前导的*号允许连续使用多个,其效果和使用一个*号一样, 但多个*号前不能有其它字符分隔,否则分隔符及后面的*号都将作为文档的内容。*号在这里是作为左边界使用,如上例的第一行和第二行;如果没有前导的*号,则边界从第一个有效字符开始,而不包括前面的空格,如上例第三行。
还有一点需要说明, 文档注释只说明紧接其后的类、 属性或者方法。如下例:

1
2
3
4
5
6
7
8
/** comment for class */
public class Test {
/** comment for a attribute */
int number;
/** comment for a method */
public void myMethod() { ...... }
......
}

上例中的三处注释就是分别对属性方法的文档注释。 它们生成的文档分别是说明紧接其后的类、属性、方法的。“紧接”二字尤其重要,如果忽略了这一点,就很可能造成生成的文档错误。如

1
2
3
4
import java.lang.*; 
/** commnet for class */
public class Test { ...... }
// 此例为正确的例子

这个文档注释将生成正确的文档。 但只需要改变其中两行的位置, 变成下例,就会出错:

1
2
3
4
/** commnet for class */
import java.lang.*;
public class Test { ...... }
// 此例为错误的例子

调换了位置后,/** commnet for class */后紧接的就是不 class Test 了,而是一个 import 语句。由于文档注释只能说明类、属性和方法.不能说明import语句,所以这个文档注释就被当作错误的说明而忽略掉了。

文档注释的三部分

根据在文档中显示的效果,文档注释分为三部分。下面是String类的charAt()方法的文档注释和源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Returns the {@code char} value at the
* specified index. An index ranges from {@code 0} to
* {@code length() - 1}. The first {@code char} value of the sequence
* is at index {@code 0}, the next at index {@code 1},
* and so on, as for array indexing.
*
* <p>If the {@code char} value specified by the index is a
* <a href="Character.html#unicode">surrogate</a>, the surrogate
* value is returned.
*
* @param index the index of the {@code char} value.
* @return the {@code char} value at the specified index of this string.
* The first {@code char} value is at index {@code 0}.
* @exception IndexOutOfBoundsException if the {@code index}
* argument is negative or not less than the length of this
* string.
*/
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}

第一部分 简述

第一部分是简述。 文档中,对于属性和方法都是先有一个列表, 然后才在后面一个一个的详细的说明。 列表中属性名或者方法名后面那段说明就是简述。 如下图中被红框框选的部分:

简述部分写在一段文档注释的最前面,第一个点号(.) 之前 ( 包括点号 )。
换句话说,就是用第一个点号之前是简述,之后是第二部分和第三部分。如上例中的 “Returns the {@code char} value at the specified index.”。

第二部分 详细说明

第二部分是详细说明部分。 该部分对属性或者方法进行详细的说明, 在格式上没有什么特殊的要求,可以包含若干个点号。它在文档中的位置如下图所示:

这部分文档在上例中相应的代码是:

1
2
3
4
5
6
7
8
9
10
11
/**
* Returns the {@code char} value at the
* specified index. An index ranges from {@code 0} to
* {@code length() - 1}. The first {@code char} value of the sequence
* is at index {@code 0}, the next at index {@code 1},
* and so on, as for array indexing.
*
* <p>If the {@code char} value specified by the index is a
* <a href="Character.html#unicode">surrogate</a>, the surrogate
* value is returned.
*

可以发现简述也在第二部分中。所以不要在详细说明部分中再写一次简述。

第三部分 特殊说明

第三部分是特殊说明部分。 这部分包括版本说明、 参数说明返回值说明等。它在文档中的位置:

第三部分在上例中相应的代码是:

1
2
3
4
5
6
* @param      index   the index of the {@code char} value.
* @return the {@code char} value at the specified index of this string.
* The first {@code char} value is at index {@code 0}.
* @exception IndexOutOfBoundsException if the {@code index}
* argument is negative or not less than the length of this
* string.

javadoc 标记

javadoc 标记是插入文档注释中的特殊标记, 它们用于标识代码中的特殊引用。javadoc 标记由“@”及其后所跟的标记类型和专用注释引用组成。虽然 @ 和 标记类型之间有时可以用空格符分隔, 但是建议将它们紧挨着写,以减少出错机会。
javadoc 标记有如下一些:

标记 用于 作用
@author 对类的说明 标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
单词 读音
param

下面详细说明各标记。

@see 的使用

@see 的用法有三种:

  • @see 类名
  • @see #方法名或属性名
  • @see 类名#方法名或属性名

@see 类名

@see 类名,可以根据需要只写出类名 ( 如@see String) 或者写出类全名 ( 如@see java.lang.String) 。那么什么时候只需要写出类名,什么时候需要写出类全名
呢?
如果 java 源文件中的 import 语句包含了的类, 可以只写出类名, 如果没有包含,则需要写出类全名。 java.lang也已经默认被包含了。所以java.lang包中的类可以直接写@see 类名就行了,而不用写@see java.lang.类名
可以简单的用javac编译来判断是写@see 类名还是@see 类全名,源程序中javac能找到的类,javadoc也一定能找到,此时就可以简写为@see 类名;javac找不到的类,javadoc也找不到,此时就只能写@see 类全名了。

@see 方法名或者属性名

方法名或者属性名, 如果是属性名, 则只需要写出属性名即可; 如果是方法名,则需要写出方法名以及参数类型,没有参数的方法,需要写出一对括号。如:

成员类型 成员名称及参数 @see 句法
属性 number @see #number
属性 count @see #count
方法 count() @see #count()
方法 show(boolean b) @see #show(boolean)
方法 sort(String[] array) @see #sort(String[])

有时也可以偷懒:假如上例中,没有 count 这一属性,那么参考方法 count() 就可以简写成 @see count 。不过,为了安全起见,还是写全 @see count() 比较好。

@see 类名#方法名或属性名

第二个句法@see #方法名或属性名中没有指出类名, 则默认为当前类。 所以它定义的参考, 都转向本类中的属性或者方法。 而第三个句法@see 类名#方法名或属性名中指出了类名, 则还可以转向其它类的属
性或者方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/** 
* @see String
* @see java.lang.StringBuffer
* @see #str
* @see #str()
* @see #sort(String[])
* @see Object#toString()
*/
public class TestJavaDoc {
/**
* 字符串成员变量.
*/
public String str;
/**
*一个方法.
*/
public void str()
{
}
/**
*排序方法.
*/
public static void sort(String[] args)
{
}
}

生成的文档的相关部分如下图:

String 和 StringBuffer 都是在 java.lang 包中,由于这个包是默认导入了的,所以这两个类可以直接写类名,也可以写类全名。 str 、str() 为同名属性和方法,所以方法名需要用()区分。sort 是带参数的方法,所以在()中指明了参数类型String[]。 toString()虽然在本类中也有( 从 Object 继承的),但我们是想参考Object类的toString() 方法,所以使用了 Object#toString()
奇怪的是,为什么其中只有 strstr()sort(String[]) 变成了链接,而String,StringBuffer,Object.toString()都没有变成链接呢?
那是因为编译时没有把 java.lang 包或者StirngStringBufferObject
三个类的源文件一起加入编译, 所以,生成的文档没有关于那三个类的信息, 也就不可以建立链接了。
上例中如果去把类中的 str 属性去掉,那么生成的文档又会有什么变化呢?

你会发现, 原来是 str, str() ,而现在变成了 str(), str() ,因为 str 属性已经没有了,所以 @ #str 也表示方法 str() 。
这两个标记分别用于指明类的作者和版本。 缺省情况下 javadoc 将其忽略,

使用 @author、@version 说明类

但命令行开关 -author-version 可以修改这个功能,使其包含的信息被输出。这两个标记的句法如下:

1
2
@author 作者名
@version 版本号

其中,@author 可以多次使用, 以指明多个作者, 生成的文档中每个作者之间使用逗号 (,) 隔开。@version 也可以使用多次,如下例:

1
2
3
4
5
6
7
8
/** 
* @author Blue
* @author Green
* @version Version 1.00
* @version Version 2.00
*/
public class TestJavaDocAuthorVerSion {
}


从图上看,作者列表是以逗号分隔的, 如果我想分行显示怎么办?

1
2
@author Blue<br>Green 
@version Version 1.00<br>Version 2.00

效果如图所示:

使用 @param 、@return 和 @exception 说明方法

这三个标记都是只用于方法的。 @param 描述方法的参数, @return 描述方法的返回值, @exception 描述方法可能抛出的异常。它们的句法如下:

1
2
3
@param  参数名 参数说明
@return 返回值说明
@exception 异常类名 说明
  • 每一个 @param 只能描述方法的一个参数,所以,如果方法需要多个参数,就需要多次使用 @param 来描述。
  • 一个方法中只能用一个 @return ,如果文档说明中列了多个 @return ,则javadoc 编译时会发出警告,且只有第一个 @return 在生成的文档中有效。
  • 方法可能抛出的异常应当用 @exception 描述。由于一个方法可能抛出多个异常,所以可以有多个 @exception 。每个 @exception 后面应有简述的异常类名,说明中应指出抛出异常的原因。 需要注意的是, 异常类名应该根据源文件的
    import 语句确定是写出类名还是类全名。

示例如下:

javadoc 命令

运行javadoc -help 可以看到 javadoc 的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
用法: javadoc [options] [packagenames] [sourcefiles] [@files]
-overview <file> 从 HTML 文件读取概览文档
-public 仅显示 public 类和成员
-protected 显示 protected/public 类和成员 (默认值)
-package 显示 package/protected/public 类和成员
-private 显示所有类和成员
-help 显示命令行选项并退出
-doclet <class> 通过替代 doclet 生成输出
-docletpath <path> 指定查找 doclet 类文件的位置
-sourcepath <pathlist> 指定查找源文件的位置
-classpath <pathlist> 指定查找用户类文件的位置
-cp <pathlist> 指定查找用户类文件的位置
-exclude <pkglist> 指定要排除的程序包列表
-subpackages <subpkglist> 指定要递归加载的子程序包
-breakiterator 计算带有 BreakIterator 的第一个语句
-bootclasspath <pathlist> 覆盖由引导类加载器所加载的
类文件的位置
-source <release> 提供与指定发行版的源兼容性
-extdirs <dirlist> 覆盖所安装扩展的位置
-verbose 输出有关 Javadoc 正在执行的操作的信息
-locale <name> 要使用的区域设置, 例如 en_US 或 en_US_WIN
-encoding <name> 源文件编码名称
-quiet 不显示状态消息
-J<flag> 直接将 <flag> 传递到运行时系统
-X 输出非标准选项的提要
通过标准 doclet 提供:
-d <directory> 输出文件的目标目录
-use 创建类和程序包用法页面
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs 递归复制文档文件子目录
-splitindex 将索引分为每个字母对应一个文件
-windowtitle <text> 文档的浏览器窗口标题
-doctitle <html-code> 包含概览页面的标题
-header <html-code> 包含每个页面的页眉文本
-footer <html-code> 包含每个页面的页脚文本
-top <html-code> 包含每个页面的顶部文本
-bottom <html-code> 包含每个页面的底部文本
-link <url> 创建指向位于 <url> 的 javadoc 输出的链接
-linkoffline <url> <url2> 利用位于 <url2> 的程序包列表链接至位于 <url> 的文档
-excludedocfilessubdir <name1>:.. 排除具有给定名称的所有文档文件子目录。
-group <name> <p1>:<p2>.. 在概览页面中, 将指定的程序包分组
-nocomment 不生成说明和标记, 只生成声明。
-nodeprecated 不包含 @deprecated 信息
-noqualifier <name1>:<name2>:... 输出中不包括指定限定符的列表。
-nosince 不包含 @since 信息
-notimestamp 不包含隐藏时间戳
-nodeprecatedlist 不生成已过时的列表
-notree 不生成类分层结构
-noindex 不生成索引
-nohelp 不生成帮助链接
-nonavbar 不生成导航栏
-serialwarn 生成有关 @serial 标记的警告
-tag <name>:<locations>:<header> 指定单个参数定制标记
-taglet 要注册的 Taglet 的全限定名称
-tagletpath Taglet 的路径
-charset <charset> 用于跨平台查看生成的文档的字符集。
-helpfile <file> 包含帮助链接所链接到的文件
-linksource 以 HTML 格式生成源文件
-sourcetab <tab length> 指定源中每个制表符占据的空格数
-keywords 使程序包, 类和成员信息附带 HTML 元标记
-stylesheetfile <path> 用于更改生成文档的样式的文件
-docencoding <name> 指定输出的字符编码

这里列举常用参数如下:

1
2
3
4
5
6
7
8
9
-public  仅显示 public  类和成员
-protected 显示 protected/public 类和成员 ( 缺省)
-package 显示 package/protected/public 类和成员
-private 显示所有类和成员
-d <directory> 输出文件的目标目录
-version 包含 @version 段
-author 包含 @author 段
-splitindex 将索引分为每个字母对应一个文件
-windowtitle <text> 文档的浏览器窗口标题

-public 、-protected 、-package、-private 四个选项

-public 、-protected 、-package、-private 四个选项,只需要任选其一即可。它们指定的显示类成员的程度。 它们显示的成员多少是一个包含的关系, 如下表:


private ( 显示所有类和成员 )
-package ( 显示 package/protected/public 类和成员 )
-protected ( 显示 protected/public 类和成员 )
-public ( 仅显示 public 类和成员 )

-d 选项

-d 选项允许你定义输出目录。如果不用 -d 定义输出目录,生成的文档文件会放在当前目录下。 -d 选项的用法是

1
-d  目录名

目录名为必填项, 也就是说, 如果你使用了 -d 参数,就一定要为它指定一个目录。这个目录必须已经存在了,如果还不存在,请在运行 javadoc 之前创建该目录。
-version-author 用于控制生成文档时是否生成 @version 和@author 指定的内容。不加这两个参数的情况下(默认情况), 生成的文档中不包含版本和作者信息。

-splitindex

-splitindex 选项将索引分为每个字母对应一个文件。 默认情况下,索引文件只有一个, 且该文件中包含所有索引内容。 当然生成文档内容不多的时候, 这样做非常合适,但是, 如果文档内容非常多的时候,这个索引文件将包含非常多的内容,显得过于庞大。使用 -splitindex 会把索引文件按各索引项的第一个字母进行分类,每个字母对应一个文件。 这样,就减轻了一个索引文件的负担。

-windowtitle

-windowtitle 选项为文档指定一个标题, 该标题会显示在窗口的标题栏上。如果不指定该标题,而默认的文档标题为“生成的文档(无标题)”。该选项的
用法是:

1
-windowtitle  标题

标题是一串没有包含空格的文本, 因为空格符是用于分隔各参数的, 所以不能包含空格。 同 -d 类似,如果指定了 -windowtitle 选项,则必须指定标题文本。

批处理变量扩展

之前写了篇详细的变量扩展的文章,但是电脑突然蓝屏,打不开了。下面是测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
echo 当前批处理文件 的 绝对路径 :%~f0
echo 当前批处理文件 的所在的 盘符 :%~d0
echo 当前批处理文件 所在的 目录路径(不带盘符):%~p0
echo 当前批处理文件 所在的 目录路径 :%~dp0
echo 当前批处理文件 的 文件名(不带后缀名) :%~n0
echo 当前批处理文件 的 文件拓展名 :%~x0
echo 当前批处理文件 的 完整文件名 :%~nx0
echo 当前批处理文件 的 绝对短文件名 :%~s0
echo 当前目录中的所有文件的绝对短文件名:
FOR /F "delims==" %%i IN ('dir /b') do echo %%~si
echo 当前批处理文件的属性 :%~a0
pause

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
当前批处理文件 的 绝对路径              :D:\学习9\书籍\批处理\for\变量\var_f2.bat
当前批处理文件 的所在的 盘符 :D:
当前批处理文件 所在的 目录路径(不带盘符):\学习9\书籍\批处理\for\变量\
当前批处理文件 所在的 目录路径 :D:\学习9\书籍\批处理\for\变量\
当前批处理文件 的 文件名(不带后缀名) :var_f2
当前批处理文件 的 文件拓展名 :.bat
当前批处理文件 的 完整文件名 :var_f2.bat
当前批处理文件 的 绝对短文件名 :D:\学习9\书籍\批处理\for\变量\var_f2.bat
当前目录中的所有文件的绝对短文件名:
D:\学习9\书籍\批处理\for\变量\DELETE~1.BAT
D:\学习9\书籍\批处理\for\变量\for.txt
D:\学习9\书籍\批处理\for\变量\temp.txt
D:\学习9\书籍\批处理\for\变量\TEST_V~1.BAT
D:\学习9\书籍\批处理\for\变量\var_f.bat
D:\学习9\书籍\批处理\for\变量\var_f2.bat
当前批处理文件的属性 :--a--------
请按任意键继续. . .

参考资料

DOS批处理高级教程精选合编版.pdf,链接:https://pan.baidu.com/s/1AQeFf4JVg4tz7tLszC-BrQ 提取码:zdow

问题描述

我想点击运行一个批处理文件(install.bat),然后把该文件所在的目录配置到path系统环境变量中。
这种功能我用在软件安装程序中,为自己的软件自动搭建好需要的环境。

遇到的问题

追加一个路径到永久的path系统环境变量中,可以通过setx /m "path" "%newpath%;%path%"命令来实现,但是我可能运行多次intall.bat,这样就会造成intall.bat会写入多个相同的路径到path环境变量中。要解决这个问题,就需要在追加新路径到path环境变量之前,先检查path环境变量中是否已经存在了该路径,如果有了该路径,那我就不需要再添加。如果没有我再添加。不能一直无脑的添加。

实现1 使用find命令

获取当前文件所在的目录

批处理中%0变量表示当前的批处理文件,%~dp0则表示当前文件的绝对路径.

1
2
3
4
5
::获取当前文件所在的目录的绝对路径
set "thispath=%~dp0"
::删除之后的路径分隔符号“\”
set "thispath=%thispath:~0,-1%"
echo 当前文件所在目录路径:%thispath%

在path环境变量中查找当前目录路径

这里使用find命令来实现查找,但是find命令好像只能在文件中查找字符串,不能再字符串中查找子串,所以我们要先把path环境变量先写到一个临时文件中,然后再在临时文件中查找。

1
2
3
4
5
6
::读取path环境变量到自定义变量中
set mypath=%path%
::把path环境变量写入临时文件中,以备后续使用findstr命令进行查找
echo %mypath% > temp.txt
::在临时文件中查找有没有当前路径
find "%thispath%" temp.txt

根据查找结果处理

批处理命令都有程序返回码errorlevel,对于find命令,如果在文件中查找到则返回0,如果没有找到则返回1,返回的结果就保存在程序返回码errorlevel中。所以我们可以根据程序返回码来做响应的条件处理:

1
2
3
4
5
6
7
8
9
if %errorlevel% == 0 (
echo path环境变量中 已经包含了 当前路径%thispath%
echo 程序返回码:%errorlevel%
) else (
echo path环境变量中 没有包含 当前路径%thispath%
echo 程序返回码:%errorlevel%
::追加当前文件所在目录的路径到path环境变量中
setx /m "path" "%thispath%;%path%"
)

设置好环境变量后,删除临时文件即可,完整的代码如下:

添加当前目录路径到path系统环境变量中 不重复添加

install.bat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
::获取当前文件所在的目录的绝对路径
set "thispath=%~dp0"
::删除之后的路径分隔符号“\”
set "thispath=%thispath:~0,-1%"
echo 当前文件所在的目录的绝对路径:%thispath%
::读取path环境变量到自定义变量中
set mypath=%path%
::把path环境变量写入临时文件中,以备后续使用findstr命令进行查找
echo %mypath% > temp.txt
::在临时文件中查找有没有当前路径
find "%thispath%" temp.txt
::如果查找到则fin命令返回0,如果没有找到find命令返回1
if %errorlevel% == 0 (
echo path环境变量中 已经包含了 当前路径%thispath%
echo 程序返回码:%errorlevel%
) else (
echo path环境变量中 没有包含 当前路径%thispath%
echo 程序返回码:%errorlevel%
::追加当前文件所在目录的路径到path环境变量中
setx /m "path" "%thispath%;%path%"
)
::删除临时文件
del temp.txt
pause

还有要注意的是setx /m "path" "%thispath%;%path%"命令需要管理员权限,所以要以管理员身份运行该批处理脚本。

实现2 使用for命令

批处理 for命令 增加 一个系统path环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@echo off
setlocal enabledelayedexpansion
set remain=%path%
::待查找字符串
set toAdd=D:\dev\workspace\MarkdownTools
::标记,默认没有重复
set finded=false
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
::如果找到相同的了
if "%toAdd%"=="%%a" (
::直接退出
goto :isFinded
::该表标记,true表示有重复的了
set finded=true
)
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
::如果没有重复:
if "%finded%"=="false" (
echo 正在修改系统path环境变量...
setx /m "path" "%toAdd%;%path%"
::结束程序
goto :end
)
:isFinded
echo path环境变量中已经有了该环境变量,无须重复添加.
:end
pause

拓展

批处理 for命令 遍历 系统path环境变量

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
setlocal enabledelayedexpansion
set remain=%path%
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
echo %%a
::剩下的赋值给原来的副本,以备下次分段
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
pause

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
D:\dev\workspace\MarkdownTools
D:\dev\workspace\HexoTools\runable
D:\dev\workspace\BaiduTranslatorPronunciationGenerator\runable
C:\Windows
C:\windows\system32
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Windows\System32\OpenSSH\
D:\快捷方式
D:\dev\java\jdk1.8.0_91\bin
F:\Program Files\nodejs\node_global
F:\Program Files\nodejs\
F:\Program Files\Git\bin
D:\dev\apache-maven-3.5.4\bin
C:\Program Files\Microsoft VS Code\bin
D:\MinGW\bin
D:\dev\apache-tomcat-8.5.35\bin
D:\dev\java\my\runable\openwith
D:\GitHub\latex
F:\texlive\2018\texlive\2018\bin\win32
D:\GitHub\MD
请按任意键继续. . .

批处理 for命令 查找 一个系统path环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
setlocal enabledelayedexpansion
set remain=%path%
echo %remain%
echo.
::待查找字符串
set toFind=D:\dev\workspace\MarkdownTools
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
if "%toFind%"=="%%a" (echo 找到:%%a)
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop

pause

运行结果:

1
2
3
4
5
6
7
D:\dev\workspace\MarkdownTools;D:\dev\workspace\HexoTools\runable;D:\dev\workspace\BaiduTranslatorPronunciationGenerator\runable;C:\Windows;C:\windows\sy
stem32;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\快捷方式;D:\dev\java\jdk1.8.0_91\bin;F:\Progr
am Files\nodejs\node_global;F:\Program Files\nodejs\;F:\Program Files\Git\bin;D:\dev\apache-maven-3.5.4\bin;C:\Program Files\Microsoft VS Code\bin;D:\Min
GW\bin;D:\dev\apache-tomcat-8.5.35\bin;D:\dev\java\my\runable\openwith;D:\GitHub\latex;F:\texlive\2018\texlive\2018\bin\win32;D:\GitHub\MD;

找到:D:\dev\workspace\MarkdownTools
请按任意键继续. . .

批处理 for命令 删除 一个系统path环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
setlocal enabledelayedexpansion
set remain=%path%
::待删除字符串
set toDel=D:\dev\workspace\MarkdownTools
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
if not "%toDel%"=="%%a" (
::如果mypath没有定义的话就直接赋值,赋值之后就只需要追加
if not defined mypath ( set mypath=%%a) else (set mypath=%mypath%;%%a)
)
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
echo 删除之前的path环境变量
echo %path%
echo.
echo 删除之后的path环境变量
echo %mypath%
echo 正在修改系统path环境变量...
setx /m "path" "%mypath%"
echo 修改完毕...
pause

参考资料

Bat 处理字符串分割 (split功能)

批处理 字符串分割 实例

使用for命令可以对字符串进行分段处理。

分割字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
::定义一个以分号作为分隔的字符串
set str=AAA;BBB;CCC;DDD;EEE;FFF
::str的副本
set remain=%str%
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
::输出第一个分段(令牌)
echo %%a
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
pause

主要解释for语句:

  • delims=;表示以分号作为分隔符,对remain字符串进行分割处理。
  • tokens=1*,tokens表示分段的方式,tokens=1*表示第一个分隔符;之前的作为一部分,剩下的(*表示)作为一部分。这

两部分在循环体总可以用%%a表示第一部分,%%b表示第二部分。

批处理 遍历path环境变量

我们知道path环境变量也是以分号作为分隔符的,批处理中,所以同样可以用上面的代码来遍历path环境变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
setlocal enabledelayedexpansion
::定义一个以分号作为分隔的字符串
set str=%path%
::str的副本
set remain=%str%
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
::输出第一个分段(令牌)
echo %%a
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
pause

运行结果:

1
2
3
4
5
6
7
8
9
D:\dev\workspace\MarkdownTools
......
C:\windows\system32
D:\dev\java\jdk1.8.0_91\bin
F:\Program Files\nodejs\node_global
F:\Program Files\Git\bin
D:\dev\apache-maven-3.5.4\bin
......
请按任意键继续. . .

批处理 判断path环境变量中是否有某个目录

例如查找系统path环境变量中是否存在D:\dev\workspace\MarkdownTools这个目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
setlocal enabledelayedexpansion
::定义一个以分号作为分隔的字符串
::set str=AAA;BBB;CCC;DDD;EEE;FFF
set str=%path%
::str的副本
set remain=%str%
set toFind=D:\dev\workspace\MarkdownTools
set isFind=false
:loop
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
if "%toFind%"=="%%a" (
::设置标记,以便后续使用
set isFind=true
::找到了就不找了
goto :finded
)
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
:finded
echo %isFind%
pause

运行结果:

1
2
true
请按任意键继续. . .

参考资料

http://blog.51cto.com/langlichong/1851961

命令格式

1
for [参数] %%变量名 in (相关文件或命令) do 执行的命令

对一个或一组文件字符串命令结果中的每一个对象执行特定命令,达到我们想要的结果。
注意:

  • 批处理文件中使用 for 命令时,指定变量请使用 %%variable,而不要用 %variable,而在cmd窗口中直接输入的for命令则使用%variable的形式。
  • 变量名称是区分大小写的,所以 %i 不同于 %I.

for命令可以带参数或不带参数,带参数时支持以下参数:/d,/l,/r,/f.

无参数

1
for %variable in (set) do command [command-parameters]
  • %variable: 指定一个单一字母可替换的参数。
  • (set):指定一个或一组文件。可以使用通配符。
  • command:指定对每个文件执行的命令。
  • command-parameters:为特定命令指定参数或命令行开关。

实例

显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)

1
for %%i in (t*.*) do echo %%i 

显示d:\mydocuments\目录下与*.doc相匹配的文件

1
for %%i in (d:\mydocuments\*.doc) do @echo %%i 

参数 /d

1
for /d %variable in (set) do command [command-parameters]

这个参数主要用于目录搜索,不会搜索文件,/d 参数只能指定目录下的目录名字,不会显示该目录的子目录下的目录。也就是只会搜索指定目录下的目录,不会搜索再下一级的目录。

实例

显示c盘根目录下的所有目录

1
2
@echo off
for /d %%i in (c:\*) do echo %%i

运行效果:

1
2
3
4
5
6
7
8
9
10
D:\学习9\书籍\批处理>for_d.bat
c:\Analog
c:\AppData
c:\Intel
c:\PerfLogs
c:\Program Files
c:\Program Files (x86)
c:\Update
c:\Users
c:\Windows

显示当前目录下名字只有1-3个字母的目录

1
2
@echo off
for /d %%i in (????) do echo %%i

运行效果:

1
2
3
4
5
6
D:\学习9\书籍\批处理>for_d2.bat
1
22
333
4444
测试目录

参数 /R

1
for /r [[drive:]path] %variable in (set) do command [command-parameters]

此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。

  • set中的文件名
    • 如果含有通配符(*),则列举/R参数指定的目录及其下面的子目录中与set相符合的所有文件,无相符文件的目录则不列举。
    • 如果set中为具体文件名,不含通配符,则枚举该目录树(并在后面加上具体的文件名),而不管set中的指定文件是否存在。

实例

遍历D:\dev\workspace\LatexTools目录树,列出目录树上的所有的java文件
for_r1.bat:

1
2
@echo off
for /r D:\dev\workspace\LatexTools %%i in (*.java) do echo %%i

运行结果:

1
2
3
4
5
6
7
D:\学习9\书籍\批处理>for_r1.bat
D:\dev\workspace\LatexTools\src\cos\tools\COSTools.java
D:\dev\workspace\LatexTools\src\latex\symbols\LatexArraow.java
D:\dev\workspace\LatexTools\src\latex\symbols\LatexInftyGenerator.java
D:\dev\workspace\LatexTools\src\latex\tools\Latex.java
D:\dev\workspace\LatexTools\src\latex\tools\LatexMain.java
D:\dev\workspace\LatexTools\src\math\tools\CrossMultiplication.java

for_r2.bat:

1
2
@echo off
for /r D:\dev\workspace\LatexTools %%i in (index.html) do if exist %%i echo %%i

运行结果:

1
2
3
4
5
D:\学习9\书籍\批处理>for_r2.bat
D:\dev\workspace\LatexTools\bin\index.html
D:\dev\workspace\LatexTools\bin\latex\symbols\index.html
D:\dev\workspace\LatexTools\src\index.html
D:\dev\workspace\LatexTools\src\latex\symbols\index.html

参数 /L

格式:

1
for /l %variable in (start,step,end) do command [command-parameters]

该集(start,step,end)表示以增量Step形式从开始到结束的一个数字序列。可以使用负的Step

  • for /l %%i in (1,1,5) do @echo %%i
    • 输出:1,2,3,4,5
  • for /l %%i in (1,2,10) do @echo %%i
    • 增量为2输出:1,3,5,7,9
  • for /l %%i in (100,-20,1) do @echo %%i
    • 增量为-20,输出:100,80,60,40,20
  • for /l %%i in (1,1,5) do start cmd –打开5个CMD窗口
  • for /l %%i in (1,1,5) do md %%i –建立名称为1,2,3,4,5的5个文件夹
  • for /l %%i in (1,1,5) do rd /q %%i –删除从1~5共5个文件夹

参数 /F

使用文件解析来处理命令输出字符串文件内容。使用迭代变量(%%i,%%j,…)定义要检査的内容或字符串,并使用各种 options选项进一步修改解析方式。使用 options令牌选项(tokens)指定哪些令牌应该作为迭代变量.
请注意:在没有使用令牌选项时,/F将只检查第一个令牌.

文件解析过程

文件解析过程包括读取命令输出字符串文件内容,将其分成独立的文本行以及**再将每行解析成零个或更多个令牌**。然后通过为令牌对应的迭代变量设置值,调用for循环。

格式

1
2
3
for /f ["options"] %variable in (file-set) do command [command-parameters]
for /f ["options"] %variable in ("string") do command [command-parameters]
for /f ["options"] %variable in ('command') do command [command-parameters]

带引号的字符串"options"包括一个或多个

  • eol=c:指一个行注释字符的结尾(就一个)
  • skip=n:指在文件开始时忽略的行数。
  • delims=xxx:指分隔符集。
  • tokens=x,y,m-n:指每行的哪一个符号被传递到for的迭代变量的。这会导致额外变量名称的分配。
    • m-n格式为一个范围。通过nth符号指定mth。
    • 如果符号字符串中的最后一个字符为星号*,这表示把剩下的字符留给下一个迭代变量。经测试,该参数最多只能区分31个字段。
  • usebackq:使用后引号(键盘上数字1左面的那个键: ` )
    • 未使用参数 usebackq 时:
      • file-set表示文件,但不能含有空格,
      • 双引号表示字符串,即”string”
      • 单引号表示执行命令,即command
    • 使用参数 usebackq时:
      • file-set和双引号,即:"file-set",都表示文件,好处在于:当文件路径或名称中有空格时,就可以用双引号括起来.
      • 单引号表示字符串,即:'sting'
      • 后引号(反引号)表示命令执行,即:`command`

实例

1
2
3
4
5
6
7
8
9
@echo off
rem 首先建立临时文件 test.txt
echo ;注释行,这是临时文件,用完删除>test.txt
echo 111213141516段>>test.txt
echo 21段,22段,23段,24段,25段,26段>>test.txt
echo 31段-32段-33段-34段-35段-36段>>test.txt
FOR /F "eol=;tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k
pause
Del test.txt

运行结果:

1
2
3
4
5
D:\学习9\书籍\批处理>for_f3.bat
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
请按任意键继续. . .

解释:

  • eol=;分号开头的行为注释行,扫描到改行for命令直接跳过。
  • tokens=1,3*将每行第1段第3段和剩余字段(*)分别赋予变量%%i,%%j,%%k
  • delims=,- (减号后有一空格)以逗号``减号空格为分隔符,空格必须放在最后

另外/F参数还可以以输出命令的结果看这个例子:

1
2
3
@echo off
FOR /F "delims=" %%i in ('net user') do @echo %%i
pause

这样你本机全部帐号名字就出来了
把扩号内的内容用两个单引号包裹起来,就表示单引号内的内容当命令来执行,
FOR会返回命令的每行结果,加那个"delims="是为了能让有空格的行能整行显示出来,不加就只显示空格左边一列!
运行结果:

1
2
3
4
5
6
7
D:\学习9\书籍\批处理>for_f4.bat
\\DESKTOP-8ISAT6B 的用户帐户
-------------------------------------------------------------------------------
Administrator DefaultAccount Guest
lan WDAGUtilityAccount
命令成功完成。
请按任意键继续. . .

参考资料

http://www.hechaku.com/arcitle/201810398.html
http://www.hechaku.com/arcitle/201810344.html

cmd 创建目录命令

mkdir命令可以用来创建目录,命令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
D:\学习9\疯狂Java讲义第三版光盘\codes\03\3.1>mkdir /?
创建目录。
mkdir [drive:]path
md [drive:]path
如果命令扩展被启用,mkdir 会如下改变:
如果需要,mkdir 会在路径中创建中级目录。例如: 假设 \a
存在,那么:
mkdir \a\b\c\d
与:
mkdir \a
chdir \a
mkdir b
chdir b
mkdir c
chdir c
mkdir d
相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d

可以看到使用mkdir,或者md命令都可以创建目录,唯一要注意的就是目录的格式要写对,可以是绝对路径(如mkdir D:\Test),也可是相对路径(如mkdir .\myjavadoc\test).