言成言成啊 | Kit Chen's Blog

Windows系统使用技巧

发布于2023-06-18 18:38:52,更新于2024-01-09 19:18:31,标签:tips windows  转载随意,文章会持续修订,请注明来源地址:https://meethigher.top/blog

使用Windows也有几个年头了。从我大学开始学打字、电脑入门,一路都是使用的Windows系统。不过好梦幻啊,我大学的时候,才会打字,现在居然是个码农!

近几年,工作原因,简单记录一些Windows中的基操!

一些内容,还是2019年时整理的,懒得修改了,看个大致思路即可。授人以鱼不如授人以渔。

Node实现交互式命令行

首先,安装环境

1
npm install prompts

其次,创建test.js

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
// 导入 prompts 模块
const prompt = require('prompts');

// 声明一个变量用于存储 interval 定时器
let interval;

// 使用异步自执行函数定义主函数
(async function () {
// 定义一系列问题的数组
const questions = [
// 文本输入问题,用户输入 Twitter 账号,可以在输入前添加 '@' 符号
{
type: 'text',
name: 'twitter',
message: `What's your twitter handle?`,
initial: `terkelg`,
format: v => `@${v}` // 将用户输入格式化为 '@username' 的形式
},
// 数字输入问题,询问用户年龄,如果年龄小于 18,则验证失败
{
type: 'number',
name: 'age',
message: 'How old are you?',
validate: value => value < 18 ? `Sorry, you have to be 18` : true // 验证函数,如果返回字符串,表示验证失败,否则验证通过
},
// 密码输入问题,用户可以输入密码
{
type: 'password',
name: 'secret',
message: 'Tell me a secret'
},
// 确认问题,用户需要确认一个问题
{
type: 'confirm',
name: 'confirmed',
message: 'Can you confirm?'
},
// 切换问题,根据上一个问题的回答来判断是否显示该问题,用户需要切换 'yes' 或 'no'
{
type: prev => prev && 'toggle',
name: 'confirmtoggle',
message: 'Can you confirm again?',
active: 'yes',
inactive: 'no'
},
// 列表问题,用户可以输入一个或多个关键词
{
type: 'list',
name: 'keywords',
message: 'Enter keywords'
},
// 选择问题,用户需要从提供的选项中选择一个颜色
{
type: 'select',
name: 'color',
message: 'Pick a color',
choices: [
{ title: 'Red', description: 'This option has a description.', value: '#ff0000' },
{ title: 'Green', value: '#00ff00' },
{ title: 'Yellow', value: '#ffff00', disabled: true },
{ title: 'Blue', value: '#0000ff' }
]
},
// 多选问题,用户可以选择多个颜色
{
type: 'multiselect',
name: 'multicolor',
message: 'Pick colors',
hint: false,
choices: [
{ title: 'Red', description: 'This option has a description.', value: '#ff0000' },
{ title: 'Green', value: '#00ff00' },
{ title: 'Yellow', value: '#ffff00', disabled: true },
{ title: 'Blue', value: '#0000ff' }
]
},
// 自动补全问题,用户可以通过输入来选择喜欢的演员
{
type: 'autocomplete',
name: 'actor',
message: 'Pick your favorite actor',
initial: 1,
limit: 3,
suggest: (input, choices) => choices.filter(i => i.title.toLowerCase().includes(input.toLowerCase())),
choices: [
{ title: 'Cage' },
{ title: 'Clooney', value: 'silver-fox' },
{ title: 'Gyllenhaal' },
{ title: 'Gibson' },
{ title: 'Grant', description: 'This option has a description.' },
{ title: 'Hanks' },
{ title: 'Downey Jr.' }
],
fallback: {
title: `This is the fallback. Its value is 'fallback'`,
value: 'fallback'
}
},
// 日期问题,用户需要输入日期,但不能选择未来的日期
{
type: 'date',
name: 'birthday',
message: `What's your birthday?`,
validate: date => date > Date.now() ? `Your birth day can't be in the future` : true
},
// 数字输入问题,用于演示 onRender 回调函数
{
type: 'number',
name: 'prompt',
message: 'This will be overridden',
onRender(color) {
this.no = (this.no || 1);
this.msg = `Enter a number (e.g. ${color.cyan(this.no)})`;
if (!interval) interval = setInterval(() => {
this.no += 1;
this.render();
}, 1000);
}
}
];

// 使用 prompts 函数来显示问题,等待用户回答
const answers = await prompt(questions, {onCancel: cleanup, onSubmit: cleanup});
console.log(answers); // 打印用户的回答
})();

// 定义一个 cleanup 函数,用于清理资源
function cleanup() {
clearInterval(interval); // 清除定时器
}

执行

1
node test.js

实战:实现交互式命令行,进行github repo的自动创建。

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
const prompt = require("prompts"); // npm install prompts
const fs = require("fs");
const http = require("https");


const filePath = process.argv[2] || "token.txt";
let token;

fs.readFile(filePath, "utf8", (err, data) => {
if (err) {
console.error(err);
process.exit(1); // 1 表示退出代码
} else {
token = data;
}
});


(async function () {
const choice = [{
type: "select",
name: "create",
message: `Do you want to create new repository? `,
choices: [
{title: "false", description: "no", value: false},
{title: "true", description: "yes", value: true},

]
}];
const choiceAnswers = await prompt(choice, {onCancel: cleanup, onSubmit: cleanup});
if (choiceAnswers.create) {
const questions = [
{
type: "text",
name: "name",
message: `What's your repo name?`,
initial: `github`
},
{
type: "text",
name: "description",
message: "What's your repo description?",
initial: `this is a demo repo`,
},
{
type: "text",
name: "homepage",
message: "What's your homepage?",
initial: `https://meethigher.top`
},
{
type: "select",
name: "private",
message: "Is is private?",
initial: false,
choices: [
{title: "false", description: "your repo is public", value: false},
{title: "true", description: "your repo is private", value: true},

]
}, {
type: "select",
name: "echo",
message: "Do you want to output git with token?",
choices: [
{title: "no", description: "no", value: false},
{title: "yes", description: "yes", value: true},
]
}
];

const answers = await prompt(questions, {onCancel: cleanup, onSubmit: cleanup});
const postData = JSON.stringify(answers);

const options = {
hostname: "api.github.com",
port: 443,
path: "/user/repos",
method: "POST",
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.100.0",
"Accept": "application/vnd.github+json",
"Authorization": `Bearer ${token}`,
"X-GitHub-Api-Version": "2022-11-28",
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(postData)
}
};

const req = http.request(options, (res) => {
console.log(`状态码:${res.statusCode}`);
//console.log('响应头:', res.headers);
if (res.statusCode === 200 || res.statusCode === 201) {
let data = `https://${token}@github.com/meethigher/${answers.name}.git`;
if (answers.echo) {
console.log(data);
}
}
//res.on('data', (data) => {
// console.log('响应数据:', data.toString());
//});
});

req.on("error", (error) => {
console.error("请求错误:", error);
});

req.write(postData);
req.end();
} else {
console.log(token);
}


})();

function cleanup() {
}

临时环境变量及进程操作

先记录一下,java应用如果想要实现Linux上nohup一样的做法,可以通过javaw实现,与java使用方法一致。

javaw,顾名思义,java-windows

查看环境变量

1
echo %JAVA_HOME%

设置临时环境变量

1
set JAVA_HOME=1

追加临时环境变量

1
set JAVA_HOME=%JAVA_HOME%;1

临时环境变量,只针对当前窗口生效

查看进程

1
tasklist | findstr "进程名称"

关闭进程

1
taskkill /f /pid 进程id

findstr 命令比 find 命令功能更强大,支持正则表达式和复杂的文本搜索模式。

windows设置自启动

关闭自启动

可以使用第三方软件,比方说电脑管家。也可以通过任务管理器-启动来关闭。

如果是win10的话,还可以在所有设置-应用-启动中进行关闭

设置自启动

普通模式启动

win+R打开运行窗口,然后复制以下内容,回车

1
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

或者直接输入shell:startup,回车

当然也可以在自己的电脑里一层一层的按这个路径找。

将要自启动的软件的快捷方式放到该文件夹即可。

管理员模式启动

普通模式启动中的做法,只适合那些不需要管理员启动的程序。如果需要管理员权限启动的程序,就会每次启动都进行弹窗如下。

为了能够实现管理员模式自启动程序,就使用到了windows自带的任务计划程序。

优劣分析

  • 优点:

    1. 计算机每次启动,后台自动管理员运行程序,且不弹窗
    2. 权限控制仍旧经过windows管理,不存在安全问题
  • 缺点:

    1. 无法像普通模式启动的程序一样,在任务管理器-启动中查看到

通过任务计划程序来实现管理员后台运行程序的缺点,刚好被大多数应用软件所利用。

如Chrome浏览器的后台自动更新,就是使用了开启自启动的任务计划。

下面一步步展开说明

1.) 搜索任务计划程序,并打开

2.) 创建基本任务,填写信息后,点击下一页,选择当前用户登录时,选择启动程序,添加参数--background设置静默启动,使用最高权限运行。最后确定即可

期间会遇到 任务 x 出错: 一个或者多个参数配置出错。

遇到这种情况,重新设置用户和组为当前用户即可。

参考链接如下

  1. 解决任务计划程序出错一个或多个指定的参数无效-百度经验
  2. 如何添加需要管理员权限(用户账户控制)软件的开机自启_哔哩哔哩_bilibili

node快速开启web服务器

有很多情况下,比如临时局域网传输个内容等,需要临时开个服务。但是借用现成的程序或其他语言手动实现,又有很多局限性。

不如直接使用node搭建,来得快、灵活。

首先创建server.js

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
const express = require("express");// npm install -g express
const path = require("path");
const serveIndex = require("serve-index"); // npm install -g serve-index

const app = express();

// 默认端口为3000
let port = 3000;

// 默认静态文件目录为 'public'
let staticPath = path.join(__dirname, "public");

// 默认不展示目录列表
let showDirectoryListing = false;

// 检查命令行参数是否包含 -p 参数(端口)和 -d 参数(静态文件目录),以及 -l 参数(展示目录列表)
const args = process.argv.slice(2);
for (let i = 1; i < args.length; i++) {
if (args[i] === "-p" && args[i + 1]) {
// 如果 -p 参数后面有一个值,则将其用作端口
port = parseInt(args[i + 1], 10);
} else if (args[i] === "-d" && args[i + 1]) {
// 如果 -d 参数后面有一个值,则将其用作静态文件目录
staticPath = path.resolve(args[i + 1]);
} else if (args[i] === "-l") {
// 如果有 -l 参数,则启用目录列表
showDirectoryListing = true;
} else if (args[i] === "-D") {
// 如果有 -D 参数,则将执行命令行所在目录作为静态文件目录
staticPath = path.resolve(args[0]);
}
}

// 使用express.static中间件来提供静态文件
app.use(express.static(staticPath));

// 如果启用目录列表,则使用 serve-index 中间件
if (showDirectoryListing) {
app.use(serveIndex(staticPath, {icons: true}));
}

// 启动服务器
app.listen(port, () => {
console.log(`Server is running on port ${port}, serving static files from ${staticPath}, showDirectoryListing is ${showDirectoryListing}`);
});

参数说明

  • -p: 服务启动端口
  • -d: 指定静态文件目录
  • -l: 启用目录列表
  • -D: 使用命令所在目录作为静态文件目录

其次,在server.js所在文件夹,安装express,并启动程序即可

1
2
3
npm install express
npm install serve-index
node server.js -p 80 -d D:\static -l

但是这样搞并不太人性化,因此添加cmd、配置环境变量。

1
2
3
@echo off
set pwd=%cd%
node D:\softTools\server-provider\server.js %pwd% %*

这个批处理脚本将会接受命令行参数并传递给node server.js命令。这意味着您可以使用server.cmd来运行服务器

Windows命令行schtasks管理定时任务

首先输入命令查看帮助

1
schtasks /?

新增任务

创建一次性任务,在15:30执行bat脚本

1
schtasks /create /tn "MyOneTimeTask" /tr "C:\Path\to\MyScript.bat" /sc once /st 15:30

参数说明

  • /create:表示要创建一个新任务。
  • /tn "TaskName":指定任务的名称。
  • /tr "ExecutablePath":指定要运行的可执行文件、脚本或命令。
  • /sc once:设置任务的计划类型为一次性。
  • /sc daily:设置任务的计划类型为每天执行。
  • /mo 1:频率为1个/sc单位的时间间隔。
  • /st HH:MM:指定任务的运行时间,以 24 小时制的时:分格式表示。

创建周期性任务,每天10:00执行bat脚本

1
schtasks /create /tn "DailyTask" /tr "C:\Path\to\MyScript.bat" /sc daily /st 10:00

删除任务

删除任务

1
schtasks /delete /tn "MyOneTimeTask" /f

参数说明

  • /delete:表示要删除一个任务。
  • /tn "TaskName":指定要删除的任务的名称。
  • /f:强制删除任务而不要求确认。

实战一

创建一个定时commit的操作,由于是windows bat执行,故需要设置编码。git仓库路径为D:/test文件夹

创建test.bat

1
2
3
4
5
@echo off
chcp 65001
D:
cd D:/test
git add -A && git commit -m "这是我的初次提交"

创建一次性任务

1
schtasks /create /tn "MyOneTimeTask" /tr "C:\Users\meethigher\Desktop\test.bat" /sc once /st 22:41

实战二

每1min,打开一次计算器

1
schtasks /create /tn "test" /tr "C:\WINDOWS\system32\calc.exe" /sc minute /mo 1  /ru system

任务的执行记录可以在控制面板-管理工具-任务计划程序中查看

Windows设置自定义暂停更新时间及彻底关闭更新

彻底关闭更新请下载Windows Update Blocker v1.8

win+r输入cmd,然后运行ctrl+shift+enter以管理员权限打开

输入以下命令,然后回车

1
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v FlightSettingsMaxPauseDays /t reg_dword /d 365 /f

表示最大允许365内不更新

原理就是直接修改了注册表,将默认值7改为了365

win+r运行配置直接打开程序

以直接进入我的博客文件夹为例。

首先在D:/softTools/blog/下创建blog.cmd

1
2
@echo off
cmd /k cd/d "D:\Develop\www\hexoBlog\blog"

@echo off表示不在控制台输出输入内容

然后配置环境变量。

输入win+r,在运行中输入blog,即可直接进入命令行

如果想要打开当前文件夹,输入以下命令

1
start .

创建右键cmd打开

cmd打开指定目录,可以通过shift+鼠标右键,或者文件夹路径上输入cmd即可。

桌面新建一个cmd.reg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Open cmd here as Admin"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""
[-HKEY_CLASSES_ROOT\Directory\Background\shell\runas]
[HKEY_CLASSES_ROOT\Directory\Background\shell\runas]
@="Open cmd here as Admin"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""
[-HKEY_CLASSES_ROOT\Drive\shell\runas]
[HKEY_CLASSES_ROOT\Drive\shell\runas]
@="Open cmd here as Admin"
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Drive\shell\runas\command]

双击运行即可

防火墙应用阻止程序

下载地址

在Windows中,您可以使用Windows防火墙来阻止或取消阻止某些应用程序,但是它的高级功能没有提供易于使用的界面。如果您想阻止应用程序访问互联网, 您必须执行以下步骤:

  1. 单击Windows“开始”菜单并打开“控制面板”
  2. 选择“系统和安全性”
  3. 然后在“防火墙”部分中,选择“允许程序通过Windows防火墙”
  4. 如果您要阻止或取消阻止的程序不是列出,您必须单击“允许另一个程序”将其添加。在列表中选择应用程序,然后选择“添加”。否则,您必须浏览硬盘驱动器以找到它,依此类推。对于普通用户来说,这似乎很复杂。

防火墙应用阻止程序使该过程非常容易!只需将要阻止的应用程序拖放到FAB窗口中,或浏览硬盘以找到它即可。

这个可以指定某个应用禁止联网,当然,是需要开启防火墙功能的,像我,一般不用防火墙,都是关闭状态。

所以,我也使用腾讯电脑管家和火绒来管理网络,比如某些app后台跑流量,腾讯或者火绒监测出来,就可以直接禁网,比方说禁用搜狗输入法的广告,直接禁用广告的程序,舒服的一批。

腾讯竟然支持禁用自己本身的网络,这点是360所没有的,这是我选择腾讯的原因。

火绒可以禁用windows系统进程的网络,比如svchost

Win递归删除指定名称文件夹

使用Windows批处理文件递归删除当前路径下的指定文件夹_William_Zhang_csdn的博客-CSDN博客

1
2
3
4
5
6
7
8
9
10
::@brief Used to delete all 'idea' folder, because it takes up more memory. eg 01idea、.idea等
::@author Create by William

@echo off

for /f "delims=" %%i in ('dir /s/b/ad *idea') do (
rd /s/q "%%~i"
)

exit

Win文件链接

创建软硬链接示例

1
2
3
4
5
6
7
mklink [[/d] | [/h] | [/j]] link target

/d 创建目录符号链接。默认为文件符号链接。
/h 创建硬链接而非符号链接。
/j 创建目录联接。
link 指定新的符号链接名称。
target 指定新链接引用的路径(相对或绝对)

比如,我为maven仓库创建软链接

1
mklink /d C:\Users\meethigher\.m2 D:\Develop\apache-maven-3.6.3\repo

win10虚拟屏幕

win+tab键,即可打开面板,新建桌面

win+ctrl+左,切换左侧桌面(右同理)

win+ctrl+D,切换到一个新创建的桌面

win+ctrl+f4,删除当前桌面

其实本身并没有啥区别,还是相当于在一个屏幕上。

比如在a桌面打开一个文件,在b桌面在去打开时,会自动跳到a桌面

如何让win10系统变得好看

直接上链接吧,

如何让Windows 10系统桌面变得更好看? - 辜月二七的回答 - 知乎

花了一个多小时整了整

TB这个软件,还行,可以让任务栏透明、高斯模糊等等

Trays这个软件,简直就是一个大型流氓,改了任务栏之后无法恢复到默认,我特么把软件卸载之后,换了个主题才恢复原样,直接改了系统配置,强买强卖嘛?

总结一下,就是不实用,还是我自己这个实用一点。

直接用电脑管家里的小火箭、桌面管理、经典开始菜单,总得来说,电脑管家还是比较方便的。

windows命令行中文乱码

查看当前cmd的编码

1
2
3
chcp
# 临时设置编码为utf-8
chcp 65001

对应关系为

十进制码值对应编码名称
950繁体中文
936简体中文默认的GBK
437MS-DOS 美国英语
65001utf-8

参考【亲测】CMD中文乱码终极解决方案_cmd中文乱码解决方法_于飞SEO的博客-CSDN博客

windows快捷键

说一下我自己比较常用的吧。可以用来快速切换

  1. win+数字键,可以快速切换任务栏内容,这可比什么quicker舒服多了
  2. win+D,返回桌面
  3. win+R,打开运行窗口
  4. win+L,锁定计算机
  5. win+tab,任务视图

windows服务管理

常规方式

windows通过命令行查看当前的环境变量

1
echo %PATH%

添加服务

1
sc create 服务名称  binpath= "D:\Service.exe" displayname= "显示名称" depend= Tcpip start= auto (启动类型)

删除服务

1
sc delete 服务名称

winsw

去GitHub下载winsw使用文档

我现在想把count.jar添加到服务自启动,将下载的WinSW.exe放到jar包所在文件夹,命名为count.exe,并添加配置文件count.xml

1
2
3
4
5
6
7
8
9
<service>
<id>CountForPage</id>
<name>CountForPage</name>
<description>陈传诚的作品,静态网页统计器</description>
<executable>java</executable>
<arguments>-Xmx100m -XX:CompressedClassSpaceSize=100m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=40 -jar count.jar</arguments>
<log mode="reset"/>
<logpath>logs</logpath>
</service>

执行命令,安装服务

1
count.exe install

删除服务

1
count.exe uninstall

Windows配置静态ip

输入命令,查看当前的默认网关

1
ipconfig

选择一个无法ping通的ip,设置成自己ip。

Windows获取局域网已有IP

查看当前局域网下所有在线的机器

1
arp -a

或使用下面局域网bat脚本

创建bat如下,若乱码,需另存设置编码。

1
for /l %%i in (1,1,255) do ping -n 1 -w 60 192.168.110.%%i | find "回复" >> pingall.txt

Win11关闭【显示更多选项】|【show more options】

可直接按照Win11关闭【显示更多选项】|【show more options】_win11 show more options_wecode.fun的博客-CSDN博客操作

win10家庭版修改用户文件夹和注册表

之前我的文件夹带空格,是这样的kit chen。桌面的文件,右键打开时,发现打不开,实在受不了了。

首先,用管理员运行cmd,开启管理员账户

1
net user administrator /active:yes #开启管理员账户

如果“发生系统错误5 拒绝访问”,就是没用管理员运行cmd。状态栏cmd右键,再右键,以管理员运行

把电脑内容都关闭,重启

开机后进入administrator账户,直接进入c盘修改用户文件夹的名称即可。

win+r,输入regedit,进入注册表编辑器

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

依次查看该目录下的内容,查看ProfileImagePath后的数据,找到修改前的用户名,将他修改成当前文件夹的名称即可。

重启。

关闭管理员账户

1
net user administrator /active:no #关闭管理员账户

参考文章

操作无法完成因为其中的文件夹或文件已在另一程序打开

windows-任务管理器-性能-打开资源监视器-cpu-关联句柄,搜索你要删除的文件夹即可。

windows查看运行时间

最简单的方法,任务管理器->性能->CPU,查看运行时间

或者通过命令行,进入Powershell

1
(get-date) - (gcim Win32_OperatingSystem).LastBootUpTime

查看准确的开机时间

1
wmic path Win32_OperatingSystem get LastBootUpTime
发布:2023-06-18 18:38:52
修改:2024-01-09 19:18:31
链接:https://meethigher.top/blog/2023/windows-tips/
标签:tips windows 
付款码 打赏 分享
shift+ctrl+1可控制目录显示