问题描述

最近我在VSCode中运行Java代码,但是奇怪的的是中文输出的是乱码.

解决方案

可能是编码的问题

一般乱码时因为java文件的编码和终端的编码不一样导致的.VScode中的内置终端默认调用的是PowerShell,所以java文件的编码和PowerShell的默认编码一样即可,建议修改成UTF-8编码.

  1. 修改java文件的编码为UTF-8
  2. 修改终端(PowerShell)的编码为UTF-8

一般来说到这里就没有乱码了,但是奇怪的是,使用System.out.println()方法输出的时候换行符是乱码的,好奇怪啊,还得再猜一猜是什么原因。

可能是VScode中的java环境版本太老

如果修改编码后,还是出现乱码,那么可能是java环境太老了,更新java环境试试:

  1. 卸载掉Java Extension Pack,
  2. 然后重启VScode,
  3. 再重新安装Java Extension Pack

可能是PowerShell版本太老

如果更新了java环境之后还是出现问题,那可能是PowerShell的问题了,接下来重新安装PowerShell试试.

  1. 打开Microsoft store
  2. 点击搜索款,输入PowerShell,安装PowerShell即可.
  3. 也可以安装Windows Terminal,Windows Terminal好像评价比较高.

我试到这一步乱码解决了,但是更新java环境后我没有测试乱码有没有解决,如果更新java环境后乱码解决了,也就不用更新PowerShell了(这是废话)。

schtask命令文档

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
schtasks /parameter [arguments] 

描述:
允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务。

参数列表:
/create 创建新计划任务。

/delete 删除计划任务。

/query 显示所有计划任务。

/change 更改计划任务属性。

/run 按需运行计划任务。

/end 中止当前正在运行的计划任务。

/showsid 显示与计划的任务名称相应的安全标识符。

/? 显示此帮助消息。

examples:
schtasks
schtasks /?
schtasks /run /?
schtasks /end /?
schtasks /create /?
schtasks /delete /?
schtasks /query /?
schtasks /change /?
schtasks /showsid /?

创建新任务计划

schtasks /create文档

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193

schtasks /create [/s system [/u username [/p [password]]]]
[/ru username [/rp password]] /sc schedule [/mo modifier] [/d day]
[/m months] [/i idletime] /tn taskname /tr taskrun [/st starttime]
[/ri interval] [ {/et endtime | /du duration} [/k] [/xml xmlfile] [/v1]]
[/sd startdate] [/ed enddate] [/it | /np] [/z] [/f] [/hresult] [/?]

描述:
允许管理员在本地或远程系统上创建计划任务。

参数列表:
/s system 指定要连接到的远程系统。如果省略这个
系统参数,默认是本地系统。

/u username 指定应在其中执行 schtasks.exe 的用户上下文。

/p [password] 指定给定用户上下文的密码。如果省略则
提示输入。

/ru username 指定任务在其下运行的“运行方式”用户帐户(用户上下文)。
对于系统帐户,有效 值是 ""、"nt authority\system" 或 "system"。
对于 v2 任务,"nt authority\localservice"和"nt authority\networkservice"以及常见的 sid 对这三个也都可用。

/rp [password] 指定“运行方式”用户的密码。要提示输
入密码,值必须是 "*" 或无。系统帐户会忽略该
密码。必须和 /ru 或 /xml 开关一起使用。

/ru/xml /sc schedule 指定计划频率。
有效计划任务: minute、 hourly、daily、weekly、
monthly, once, onstart, onlogon, onidle, onevent.

/mo modifier 改进计划类型以允许更好地控制计划重复周期。有效值列于下面“修改者”部分中。

/d days 指定该周内运行任务的日期。有效值:
mon、tue、wed、thu、fri、sat、sun
和对 monthly 计划的 1 - 31
(某月中的日期)。通配符“*”指定所有日期。

/m months 指定一年内的某月。默认是该月的第一天。
有效值: jan、feb、mar、apr、may、jun、
jul、 aug、sep、oct、nov 和 dec。通配符
“*” 指定所有的月。

/i idletime 指定运行一个已计划的 onidle 任务之前
要等待的空闲时间。
有效值范围: 1999 分钟。

/tn taskname 以路径\名称形式指定
对此计划任务进行唯一标识的字符串。

/tr taskrun 指定在这个计划时间运行的程序的路径
和文件名。
例如: c:\windows\system32\calc.exe

/st starttime 指定运行任务的开始时间。
时间格式为 hh:mm (24 小时时间),例如 14:30 表示
2:30 pm。如果未指定 /st,则默认值为
当前时间。/sc once 必需有此选项。

/ri interval 用分钟指定重复间隔。这不适用于
计划类型: minute、hourly、
onstart, onlogon, onidle, onevent.
有效范围: 1 - 599940 分钟。
如果已指定 /et 或 /du,则其默认值为
10 分钟。

/et endtime 指定运行任务的结束时间。
时间格式为 hh:mm (24 小时时间),例如,14:50 表示 2:50 pm。
这不适用于计划类型: onstart、
onlogon, onidle, onevent.

/du duration 指定运行任务的持续时间。
时间格式为 hh:mm。这不适用于 /et 和
计划类型: onstart, onlogon, onidle, onevent.
对于 /v1 任务,如果已指定 /ri,则持续时间默认值为
1 小时。

/k 在结束时间或持续时间终止任务。
这不适用于计划类型: onstart、
onlogon, onidle, onevent.
必须指定 /et 或 /du。

/sd startdate 指定运行任务的第一个日期。
格式为 yyyy/mm/dd。默认值为
当前日期。这不适用于计划类型: once、
onstart, onlogon, onidle, onevent.

/ed enddate 指定此任务运行的最后一天的日期。
格式是 yyyy/mm/dd。这不适用于计划类型:
once、onstart、onlogon、onidle。

/ec channelname 为 onevent 触发器指定事件通道。

/it 仅有在 /ru 用户当前已登录且
作业正在运行时才可以交互式运行任务。
此任务只有在用户已登录的情况下才运行。

/np 不储存任何密码。任务以给定用户的身份
非交互的方式运行。只有本地资源可用。

/z 标记在最终运行完任务后删除任务。

/xml xmlfile 从文件的指定任务 xml 中创建任务。
可以组合使用 /ru 和 /rp 开关,或者在任务 xml 已包含
主体时单独使用 /rp。

/v1 创建 vista 以前的平台可以看见的任务。
不兼容 /xml。

/f 如果指定的任务已经存在,则强制创建
任务并抑制警告。

/rl level 为作业设置运行级别。有效值为
limited 和 highest。默认值为 limited。

/delay delaytime 指定触发触发器后延迟任务运行的
等待时间。时间格式为
mmmm:ss。此选项仅对计划类型
onstart, onlogon, onevent.

/hresult 为获得更出色的故障诊断能力,处理退出代码
将采用 hresult 格式。

/? 显示此帮助消息。

修改者: 按计划类型的 /mo 开关的有效值:
minute: 1 到 1439 分钟。
hourly: 1 - 23 小时。
daily: 1 到 365 天。
weekly: 1 到 52 周。
once: 无修改者。
onstart: 无修改者。
onlogon: 无修改者。
onidle: 无修改者。
monthly: 1 到 12,或
first, second, third, fourth, last, lastday

onevent: xpath 事件查询字符串。
示例:
==> 在远程机器 "abc" 上创建计划任务 "doc",
该机器每小时在 "runasuser" 用户下运行 notepad.exe

schtasks /create /s abc /u user /p password /ru runasuser
/rp runaspassword /sc hourly /tn doc /tr notepad

==> 在远程机器 "abc" 上创建计划任务 "accountant",
在指定的开始日期和结束日期之间的开始时间和结束时间内,
每隔五分钟运行 calc.exe

schtasks /create /s abc /u domain\user /p password /sc minute
/mo 5 /tn accountant /tr calc.exe /st 12:00 /et 14:00
/sd 06/06/2006 /ed 06/06/2006 /ru runasuser /rp userpassword

==> 创建计划任务 "gametime",在每月的第一个星期天
运行“空当接龙”。

schtasks /create /sc monthly /mo first /d sun /tn gametime
/tr c:\windows\system32\freecell

==> 在远程机器 "abc" 创建计划任务 "report",
每个星期运行 notepad.exe

schtasks /create /s abc /u user /p password /ru runasuser
/rp runaspassword /sc weekly /tn report /tr notepad.exe

==> 在远程机器 "abc" 创建计划任务 "logtracker",
每隔五分钟从指定的开始时间到无结束时间,
运行 notepad.exe。将提示输入 /rp
密码。

schtasks /create /s abc /u domain\user /p password /sc minute
/mo 5 /tn logtracker
/tr c:\windows\system32\notepad.exe /st 18:30
/ru runasuser /rp

==> 创建计划任务 "gaming",每天从 12:00 点开始到
14:00 点自动结束,运行 freecell.exe

schtasks /create /sc daily /tn gaming /tr c:\freecell /st 12:00
/et 14:00 /k
==> 创建计划任务“eventlog”以开始运行 wevtvwr.msc
只要在“系统”通道中发布事件 101

schtasks /create /tn eventlog /tr wevtvwr.msc /sc onevent
/ec system /mo *[system/eventid=101]
==> 文件路径中可以加入空格,但需要加上两组引号,
一组引号用于 cmd.exe,另一组用于 schtasks.exe。用于 cmd
的外部引号必须是一对双引号;内部引号可以是一对单引号或
一对转义双引号:
schtasks /create
/tr "'c:\program files\internet explorer\iexplorer.exe'
\"c:\log data\today.xml\"" ...

定时关机

先用计算器测试

在00:53时启动计算器

1
schtasks /create /tn shutdown_test /st 00:53 /sc once /tr "c:\windows\system32\calc.exe"

查询任务计划

语法

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

schtasks /query [/s system [/u username [/p [password]]]]
[/fo format | /xml [xml_type]] [/nh] [/v]
[/tn taskname] [/hresult] [/?]

描述:
允许管理员显示本地或远程系统上的计划任务。

参数列表:
/s system 指定要连接到的远程系统。

/u username 指定 schtasks.exe 要执行的用户上下文。

/p [password] 指定给定的用户上下文密码。如果省略则
提示输入。

/fo format 为输出指定格式。有效值: table、list、csv。

/nh 指定在输出中不显示列标题。
只对 table 格式有效。
仅适用于 table 和 csv 格式。

/v 显示详细任务输出。

/tn taskname 指定要检索其信息的任务路径\名称,
否则会检索所有任务的信息。

/xml [xml_type] 以 xml 格式显示任务定义。

如果 xml_type 为 one,则输出为一个有效 xml 文件。

如果 xml_type 不存在,则输出将为

所有 xml 任务定义的串联。

/hresult 为获得更出色的故障诊断能力,处理退出代码
将采用 hresult 格式。

/? 显示此帮助消息。

示例:
schtasks /query
schtasks /query /?
schtasks /query /s system /u user /p password
schtasks /query /fo list /v /s system /u user /p password
schtasks /query /fo table /nh /v

查询该任务:

1
SCHTASKS /Query /TN shutdown_test

显示效果:

1
2
3
4
5
C:\Users\lan>SCHTASKS /Query /TN shutdown_test
文件夹: \
任务名 下次运行时间 模式
======================================== ====================== ===============
shutdown_test N/A 就绪

删除任务计划

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

schtasks /delete [/s system [/u username [/p [password]]]]
/tn taskname [/f] [/hresult] [/?]

描述:
删除一个或多个计划任务。

参数列表:
/s system 指定要连接到的远程系统。

/u username 指定 schtasks.exe 要执行的用户上下文。

/p [password] 指定给定用户上下文密码。如果省略则
提示输入。

/tn taskname 指定要删除的任务的路径\名称。
可以使用通配符 "*" 来删除所有任务。

/f 强制删除该任务,而且
如果指定的任务当前正在运行,则抑制警告。

/hresult 为获得更好的故障诊断能力,处理退出代码
将采用 hresult 格式。

/? 显示此帮助消息。

示例:
schtasks /delete /tn * /f
schtasks /delete /tn "\备份\备份和还原"
schtasks /delete /s system /u user /p password /tn "\备份\启动还原"
schtasks /delete /s system /u user /p password /tn "\备份\启动备份" /f

删除上面创建的任务

1
schtasks /delete /tn  taskname shutdown_test

运行结果:

1
2
3
4
E:\dev2\idea_workspace\CodeGenerator>schtasks /delete /tn shutdown_test
警告: 确实要删除任务 "shutdown_test" 吗 (Y/N )? y
成功: 计划的任务 "shutdown_test" 被成功删除。

UML类图

UML类图关系

UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。

关系的强弱

各种关系的强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

2.1.泛化

【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何继承父类的所有特征和行为。

符号

箭头:空心三角形
箭身:实线

代码体现

java中继承通过extends关键字来定义.

实例

例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
这里有一张图片

2.2.实现

【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。

符号

箭头:空心三角形
箭身:虚线

代码体现

java实现通过implement关键字来定义。

实例

这里有一张图片

2.3.关联

【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师可以知道它的学生,丈夫可以知道妻子。关联可以是双向的,也可以是单向的。

符号

箭头:

  • 双向的关联可以有两个箭头或者没有箭头
  • 单向的关联有一个箭头。
  • 箭头指向被关联的类

箭身:实线

代码体现

使用关联类作为当前类的成员变量实现。

实例

这里有一张图片

2.4. 聚合关系

**聚合关系:是整体与部分的关系,且部分可以离开整体而单独存在**。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

符号

聚合关系的箭头有两个,一个是空心的菱形,一个是普通箭头。菱形的一端指向整体,普通箭头指向部分
箭身:和关联关系一样是实线

代码体现

通过定义成员变量实现。

实例

这里有一张图片

2.5.组合关系

组合关系:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。
组合关系是关联关系的一种
是比聚合关系还要强的关系.

符号

  • 箭头及指向
    • 实心菱形指向整体
    • 普通箭头指向部分
  • 箭身:实线

代码体现

通过定义成员变量实现。

实例

这里有一张图片

2.6.依赖

依赖关系是指一个类的元素使用了另一个类,依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的类。
这里有一张图片

参考资料

https://zhuanlan.zhihu.com/p/44518805

timeout命令

帮助文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
timeout [/t] timeout [/nobreak] 

描述:
这个工具接受超时参数,等候一段指定的时间(秒)或等按任意键。它还接受
一个参数,忽视按键。

参数列表:
/t timeout 指定等候的秒数。有效范围从 -199999 秒。
/nobreak 忽略按键并等待指定的时间。
/? 显示此帮助消息。

注意: 超时值 -1 表示无限期地等待按键。

示例:
timeout /?
timeout /t 10
timeout /t 300 /nobreak
timeout /t -1

应用

这个命令可以使用&&连接符与其他命令串联到一起,从而实现定时执行后面命令的功能。

30秒后休眠电脑

1
timeout /t 30 /nobreak && shutdown -h

定时休眠批处理程序

下面根据用户输入的秒数来休眠电脑:

1
2
3
4
5
@echo off
set /P waitTime=输入要休眠的秒数:
timeout /t %waitTime% /nobreak && shutdown -h
REM timeout /t %waitTime% /nobreak && echo 休眠电脑啦!
REM pause

cmd shutdown命令

帮助文档

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f]
[/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]]

没有参数 显示帮助。这与键入 /? 是一样的。
/? 显示帮助。这与不键入任何选项是一样的。
/i 显示图形用户界面(GUI)。
这必须是第一个选项。
/l 注销。这不能与 /m 或 /d 选项一起使用。
/s 关闭计算机。
/sg 关闭计算机。在下一次启动时,
重启任何注册的应用程序。
/r 完全关闭并重启计算机。
/g 完全关闭并重新启动计算机。在重新启动系统后,
重启任何注册的应用程序。
/a 中止系统关闭。
这只能在超时期间使用。
与 /fw 结合使用,以清除任何未完成的至固件的引导。
/p 关闭本地计算机,没有超时或警告。
可以与 /d 和 /f 选项一起使用。
/h 休眠本地计算机。
可以与 /f 选项一起使用。
/hybrid 执行计算机关闭并进行准备以快速启动。
必须与 /s 选项一起使用。
/fw 与关闭选项结合使用,使下次启动转到
固件用户界面。
/e 记录计算机意外关闭的原因。
/o 转到高级启动选项菜单并重新启动计算机。
必须与 /r 选项一起使用。
/m \\computer 指定目标计算机。
/t xxx 将关闭前的超时时间设置为 xxx 秒。
有效范围是 0-315360000 (10 年),默认值为 30
如果超时时间大于 0,则默示为
/f 参数。
/c "comment" 有关重新启动或关闭的原因的注释。
最多允许 512 个字符。
/f 强制关闭正在运行的应用程序而不事先警告用户。
如果为 /t 参数指定大于 0 的值,
则默示为 /f 参数。
/d [p|u:]xx:yy 提供重新启动或关闭的原因。
p 指示重启或关闭是计划内的。
u 指示原因是用户定义的。
如果未指定 p 也未指定 u,则重新启动或关闭
是计划外的。
xx 是主要原因编号(小于 256 的正整数)。
yy 是次要原因编号(小于 65536 的正整数)。

此计算机上的原因:
(E = 预期 U = 意外 P = 计划内,C = 自定义)
类别 主要 次要 标题

U 0 0 其他(计划外)
E 0 0 其他(计划外)
E P 0 0 其他(计划内)
U 0 5 其他故障: 系统没有反应
E 1 1 硬件: 维护(计划外)
E P 1 1 硬件: 维护(计划内)
E 1 2 硬件: 安装(计划外)
E P 1 2 硬件: 安装(计划内)
E 2 2 操作系统: 恢复(计划外)
E P 2 2 操作系统: 恢复(计划内)
P 2 3 操作系统: 升级(计划内)
E 2 4 操作系统: 重新配置(计划外)
E P 2 4 操作系统: 重新配置(计划内)
P 2 16 操作系统: Service Pack (计划内)
2 17 操作系统: 热修补(计划外)
P 2 17 操作系统: 热修补(计划内)
2 18 操作系统: 安全修补(计划外)
P 2 18 操作系统: 安全修补(计划内)
E 4 1 应用程序: 维护(计划外)
E P 4 1 应用程序: 维护(计划内)
E P 4 2 应用程序: 安装(计划内)
E 4 5 应用程序: 没有反应
E 4 6 应用程序: 不稳定
U 5 15 系统故障: 停止错误
U 5 19 安全问题(计划外)
E 5 19 安全问题(计划外)
E P 5 19 安全问题(计划内)
E 5 20 网络连接丢失(计划外)
U 6 11 电源故障: 电线被拔掉
U 6 12 电源故障: 环境
P 7 0 旧版 API 关机

shutdown /i

启动后的图形界面如下图所示,但是我看不懂该怎么操作。知道就行。

image-20220426132253567

shutdown /h

这个命令可以让当前计算机立即休眠。
需要注意的是,shutdown /h -t 60这样的命令是错误的。

应用

定时关机

命令 描述
shutdown -s -t 0 立即关机
shutdown -s -t 3600 3600秒后关机

在执行其他命令后休眠

可以使用&&符号把命令链接起来,例如:
A命令 && B命令的意思是先执行A命令,如果A命令执行成功则执行B命令
我有使用Hexo写博客,在睡觉之前我会发布博客,但是发布需要一定的时间,可以通过在发布命令后用&&连接上休眠命令shutdown /h,这样发布接收之后就会休眠电脑。
休眠的好处就是下次开机不用打开常用的软件.

命令 描述
hexo clean&&hexo g&&hexo d&&shutdown /h 发布Hexo博客后休眠电脑

在eclipse项目路径下启动cmd并解决乱码

在eclipse中启动cmd

依次点击菜单栏上的RunExternal tools,这样会弹出的External Tools Configurations对话框,在该对话框左边的Program上右键,选择New Configuration,然后:

  1. name:输入框中输入名字cmd
  2. Location:输入框中输入cmd.exe的路径:C:\Windows\System32\cmd.exe
  3. Working Directory输入框输入:${project_loc},这两个可以点击右边的Variables…按钮进行选择.这个${project_loc}的意思就是当前项目的路径.

选择cmd的编码为GBK

点击最右边的Common选项卡,然后在Encoding选择框里面选择GBK即可。

启动cmd.exe

Package Explorer中点击要打开的项目或者项目中的文件,这样${workspace_loc}${project_path}才能正确定位到项目路径.然后接着点击RunExternal Toolscmd即可在该项目下启动cmd.

操作过程

如下gif所示:
这是一个gif文件

win10中设置打开或保存文件时的默认查看方式

最近我在编辑器中保存文件到本地或者打开本地文件时,弹出的资源管理器中的查看方式突然变成的大图标:
这里有一张图片
大图标的查看方式,文件名不再一行上,找一个文件,还要浪费精力去看文件名称,浪费时间.
所以我平时喜欢用详细列表这种查看方式.详细列表查看方式文件名在一行上,方便找出文件.每次保存文件时我都要调整一次查看方式,这让我很烦躁.

分析

经过排查,发现是默认的查看方式被修改成大图标导致的,重新改回详细列表即可.下面是操作步骤.

Win10 设置资源管理器中的默认查看方式

先随意打开一个文件夹,切换到查看选项卡,可以发现现在的查看方式不是详细列表,而是大图标:
这里有一张图片
现在选择详细列表,然后点击右边的选项按钮:
这里有一张图片
在弹出的文件夹选项对话框中,点击查看选项卡,然后点击应用到文件夹按钮.
这里有一张图片
接着会弹出提示信息是否让这种美型的所有文件夹与此文件奕的视图设置匹配?,点击即可
这里有一张图片
这样在软件中打开文件时的视图就都按照详细列表方式进行排序了:
这里有一张图片

批处理 读取剪贴板

批处理 将命令输出写如剪贴板

批处理中如果想把命令的输出写入剪贴板是很容易的,使用管道符+clip即可实现,例如

1
dir | clip

这个命令把dir命令的输出写入到剪贴板中,剪贴板中的文本,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 驱动器 G 中的卷是 原来的C盘
卷的序列号是 0C02-061D

G:\Desktop\Vscode测试 的目录

2019/08/26 23:14 <DIR> .
2019/08/26 23:14 <DIR> ..
2019/07/22 01:44 28 spanButtonCSS.txt
2019/08/26 23:06 146 test.bat
2019/07/23 17:22 314 test.html
2019/07/12 23:33 852 Test.java
2019/05/29 11:18 8,350 test.jsp
2019/07/24 21:19 1,588 test.md
2019/08/26 22:58 57 tmp.txt
2019/08/26 22:24 245 treej.bat
2019/04/29 13:50 613 正则表达式步骤.md
9 个文件 12,193 字节
2 个目录 215,235,579,904 可用字节

cmd中把命令写到剪贴板

clip的输入是前一个命令的输出。如何把命令本身写到剪贴板,而不执行该命令呢。
只需要在前面加上echo命令即可

例如:

1
echo adb install souhushipin.apk | clip

即可把该命令adb install souhushipin.apk复制到剪贴板中。
如果少了echo,

1
adb install souhushipin.apk | clip

则会执行该adb命令,并将该命令的输出写入到剪贴板中。

批处理 读取剪贴板

遗憾的是,批处理好像没有提供读取剪贴板的功能(反正我查了好久没查到).那只能迂回实现了.

for命令可以遍历另一个命令的输出结果

如下格式的for命令,可以遍历单引号中命令的输出结果.注意,命令要写在单引号中.

1
2
3
FOR /F "delims=" %%i in ('命令') do (
echo %%i
)

所以,我只要自己写一个PrintClip命令:这个PrintClip命令可以打印出剪贴板中的文本到标准输出.这样我就可通过上述的for命令遍历PrintClip命令的标准输出,进入实现读取剪贴板的功能。

java代码

这个输出剪贴板文本的代码很简单,如下所示:

PrintClip.java

1
2
3
4
5
6
7
8
9
10
package clipoard.output;
import clipboard.util.SysClipboardUtil;
/**
* 输出剪贴板中的内容.
*/
public class PrintClip {
public static void main(String[] args) {
System.out.print(SysClipboardUtil.getSysClipboardText());
}
}

其中SysClipboardUtil是读写剪贴板的工具类,该工具类源码如下:

SysClipboardUtil.java

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package clipboard.util;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class SysClipboardUtil
{
/**
* 从剪贴板中获取文本.
*
* @return 如果剪贴板中没有文本,则返回null.如果获取到文本,则返回文本.
*/
public static String getSysClipboardText()
{
// 代码兼容JDK6,不然剪贴板获取文本可能错误
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
String text = null;
Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
// 获取剪切板中的内容
Transferable clipTf = sysClip.getContents(null);

if (clipTf != null)
{
// 检查内容是否是文本类型
if (clipTf.isDataFlavorSupported(DataFlavor.stringFlavor))
{
try
{
// 转换为文本
text = (String) clipTf
.getTransferData(DataFlavor.stringFlavor);
} catch (Exception e)
{
e.printStackTrace();
}
}
}

return text;
}
/**
* 把字符串写到系统剪贴板。
*
* @param writeMe
* 要写入剪贴板的文本
*/
public static void setSysClipboardText(String writeMe)
{
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}
/**
* 从系统剪贴板获取图片。
*
* @return 系统剪贴板里面的图片。
*/
public static BufferedImage getImageFromClipboard()
{
try
{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable cc = sysc.getContents(null);
if (cc == null)
return null;
else if (cc.isDataFlavorSupported(DataFlavor.imageFlavor))
return (BufferedImage) cc
.getTransferData(DataFlavor.imageFlavor);
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}

/**
* 把图片复制到剪贴板中。
*
* @param image
* 要复制到剪贴板的图片。
*/
public static void setClipboardImage(final Image image)
{
Transferable trans = new Transferable()
{
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]
{DataFlavor.imageFlavor};
}

public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
}

public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
}

};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,
null);
}

}

PrintClip.java导出成可执行Jar包,然后写一个同名的批处理文件PrintClip.bat来运行这个可执行jar,如下:

1
2
@echo off
java -jar "E:\dev2\idea_workspace\MyJavaTools\runable\PrintClip.jar"

配置path环境变量

为了让PrintClip.bat可以在任意地方调用,需要把PrintClip.bat文件所在的目录的路径配置到**Path环境变量**中,这和把java.exe所在的路径配置到Path环境变量之后,就可也在cmd中执行java命令是一样的道理。
配置好Path环境变量后就可以通过自定义的PrintClip命令来输出剪贴板中的内容了。

测试

现在复制下面的测试字符串:

1
HelloWorld!

然后打开cmd,运行PrintClip命令,效果如下所示:

1
2
3
4
5
6
Microsoft Windows [版本 10.0.17134.915]
(c) 2018 Microsoft Corporation。保留所有权利。

G:\Desktop\Vscode测试>PrintClip
HelloWorld!
G:\Desktop\Vscode测试>

好的现在自定义的命令PrintClip已经可以输出剪贴板中的内容到标准输出了,接下来用for命令遍历PrintClip命令的输出即可读取剪贴板中的内容。

使用For命令读入PrintClip命令的输出

1
2
3
4
5
6
7
8
@echo off
FOR /F "delims=" %%i in ('PrintClip') do (
::保存下剪贴板中的内容
set strInClip=%%i
)
:: 输出剪贴板中的内容
echo 剪贴板中的内容:%strInClip%
pause

现在复制下面的测试字符串:

1
HelloWorld!

然后运行这个批处理,运行效果如下:

1
2
剪贴板中的内容:HelloWorld!
请按任意键继续. . .

好的,这就实现了读取剪贴板的内容了.

应用

我这么做是为了,方便使用自定义的mytree命令打印Java项目的目录结构,这样我在IDE中复制好Java项目的路径之后,就可以通过读取剪贴板中项目的路径,切换盘符,进入项目所在的路径,然后就可以调用mytree命令将项目的目录结构输出到剪贴板中.接着再调用另一个自定义命令m,将剪贴板中的数据格式化成Markdown代码块.
说了一堆,这个批处理代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
:: 读取剪贴板中的内容,注意这里要求输入的是Java项目的路径.
FOR /F "delims=" %%i in ('PrintClip') do (
::切换盘符
%%~di
::进入目录
cd %%i
)
:: 打印Java项目的目录结构,并输出重定向到剪贴板中.
mytree java|clip
:: 将剪贴板中的文本封装成Markdown代码块
m cb cmd

其中%%~di是变量拓展,获取该路径所在的盘符的意思,cd %%i表示切换到该路径下.剩下的倒数两个命令是我自定义的命令.

批处理 start命令

帮助文档

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
启动一个单独的窗口以运行指定的程序或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
[command/program] [parameters]

"title" 在窗口标题栏中显示的标题。
path 启动目录。
B 启动应用程序,但不创建新窗口。
应用程序已忽略 ^C 处理。除非应用程序
启用 ^C 处理,否则 ^Break 是唯一可以中断
该应用程序的方式。
I 新的环境将是传递
cmd.exe 的原始环境,而不是当前环境。
MIN 以最小化方式启动窗口。
MAX 以最大化方式启动窗口。
SEPARATE 在单独的内存空间中启动 16 位 Windows 程序。
SHARED 在共享内存空间中启动 16 位 Windows 程序。
LOW 在 IDLE 优先级类中启动应用程序。
NORMAL 在 NORMAL 优先级类中启动应用程序。
HIGH 在 HIGH 优先级类中启动应用程序。
REALTIME 在 REALTIME 优先级类中启动应用程序。
ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
NODE 将首选非一致性内存结构(NUMA)节点指定为
十进制整数。
AFFINITY 将处理器关联掩码指定为十六进制数字。
进程被限制在这些处理器上运行。

将 /AFFINITY 和 /NODE 结合使用时,会对关联掩码
进行不同的解释。指定关联掩码,以便将零位作为起始位置(就如将 NUMA
节点的处理器掩码向右移位一样)。
进程被限制在指定关联掩码和 NUMA 节点之间的
那些通用处理器上运行。
如果没有通用处理器,则进程被限制在
指定的 NUMA 节点上运行。
WAIT 启动应用程序并等待它终止。
command/program
如果它是内部 cmd 命令或批文件,则
该命令处理器是使用 cmd.exe 的 /K 开关运行的。
这表示运行该命令之后,该窗口
将仍然存在。

如果它不是内部 cmd 命令或批文件,则
它就是一个程序,并将作为一个窗口化应用程序或
控制台应用程序运行。

parameters 这些是传递给 command/program 的参数。

注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 选项。

通过指定 /NODE,可按照利用 NUMA 系统中的内存区域的方式
创建进程。例如,可以创建两个完全
通过共享内存互相通信的进程以共享相同的首选 NUMA 节点,
从而最大限度地减少内存延迟。只要有可能,
它们就会分配来自相同 NUMA 节点的
内存,并且会在指定节点之外的处理器上自由运行。

start /NODE 1 application1.exe
start /NODE 1 application2.exe

这两个进程可被进一步限制在相同 NUMA 节点内的指定处理器
上运行。在以下示例中,application1 在
节点的两个低位处理器上运行,而 application2
在该节点的其后两个处理器上运行。该示例假定指定节点至少具有四个逻辑处理器。请注意,节点号可更改为该计算机的任何有效节点号,
而无需更改关联掩码。

start /NODE 1 /AFFINITY 0x3 application1.exe
启动 /NODE 1 /AFFINITY 0xc application2.exe

如果命令扩展被启用,通过命令行或 START 命令的外部命令
调用会如下改变:

将文件名作为命令键入,非可执行文件可以通过文件关联调用。
(例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
关于如何从命令脚本内部创建这些关联,请参阅 ASSOC
FTYPE 命令。

执行的应用程序是 32 位 GUI 应用程序时,CMD.EXE 不等应用
程序终止就返回命令提示符。如果在命令脚本内执行,该新行为
则不会发生。

如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这
防止从当前目录提取 CMD.EXE。

如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
名。PATHEXT 变量的默认值是:

.COM;.EXE;.BAT;.CMD

请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。

查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。

帮助文档解释

上面格式有点长,可以精简为start 选项 程序 参数;

应用

在特定目录下启动cmd

命令格式:start /d 目录路径 cmd.exe
例如:

1
start /d E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\lazy-init cmd.exe